You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Tinylog 2在Android 13环境下配置绝对日志路径及权限问题咨询

Tinylog 2在Android 13环境下配置绝对日志路径及权限问题咨询

嗨Jim,针对你在Android 13上使用Tinylog 2的两个问题,我来给你详细梳理下解决方案:

一、配置绝对日志路径到/storage/emulated/0/MyLogs

要让Tinylog 2写入指定的绝对目录,核心是明确指定文件路径并提前确保目录存在,你可以通过两种方式实现:

方式1:Java代码动态配置

这种方式灵活性更高,适合需要动态调整路径的场景:

// 第一步:先创建目标日志目录(Tinylog不会自动创建目录)
File logDirectory = new File("/storage/emulated/0/MyLogs");
if (!logDirectory.exists()) {
    boolean isCreated = logDirectory.mkdirs();
    if (!isCreated) {
        // 处理目录创建失败的情况,比如打印系统日志提示
        android.util.Log.e("TinylogSetup", "Failed to create target log directory");
        return;
    }
}

// 第二步:配置Tinylog的文件写入器
FileWriterConfiguration fileConfig = new FileWriterConfiguration();
// 指定日志文件路径,这里设置为按日期生成滚动日志文件
fileConfig.setFile("/storage/emulated/0/MyLogs/app_%d{yyyy-MM-dd}.log");
// 开启日志追加模式,避免覆盖旧日志
fileConfig.setAppend(true);
// 自定义日志格式(可选)
fileConfig.setFormat("{date:yyyy-MM-dd HH:mm:ss} {level}: {message}");

// 将配置添加到Tinylog生效
LoggingConfiguration.getInstance().addWriter(fileConfig);

方式2:使用tinylog.properties配置文件

src/main/resources目录下创建tinylog.properties,添加以下配置:

# 启用文件写入器
writer1 = file
# 指定日志文件的绝对路径
writer1.file = /storage/emulated/0/MyLogs/app.log
# 开启追加模式
writer1.append = true
# 定义日志输出格式
writer1.format = {date:yyyy-MM-dd HH:mm:ss} {level}: {message}

注意:使用这种方式时,同样要在App启动时先确保/storage/emulated/0/MyLogs目录存在,否则日志无法正常写入。

二、Android 13下的文件权限问题

Tinylog 2本身不处理Android系统的文件权限,权限需要你在App层面自行处理,分两种情况说明:

情况1:坚持使用公共外部目录(/storage/emulated/0/MyLogs

Android 13对公共外部存储的访问权限做了严格限制:

  • 要写入公共目录下的自定义文件夹(比如MyLogs),必须申请MANAGE_EXTERNAL_STORAGE特殊权限,这个权限需要用户手动到系统设置中授予。
  • 具体步骤:
    1. AndroidManifest.xml中添加权限声明:
      <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
      <!-- 兼容Android 12及以下版本的写入权限 -->
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
      
    2. 在代码中检查并引导用户授予权限:
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
          // 检查是否拥有全文件访问权限
          if (!Environment.isExternalStorageManager()) {
              Intent permissionIntent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
              Uri packageUri = Uri.fromParts("package", getPackageName(), null);
              permissionIntent.setData(packageUri);
              startActivity(permissionIntent);
              // 建议延迟初始化Tinylog,直到用户授予权限
              return;
          }
      } else {
          // 处理Android 12及以下版本的WRITE_EXTERNAL_STORAGE权限申请
          if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
              ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1001);
              return;
          }
      }
      

情况2:不想申请任何文件权限

如果你的App不需要文件权限,建议使用App专属外部存储目录,这个路径不需要任何权限,且卸载App时会自动清理:

// 获取App专属外部存储的MyLogs目录
File privateLogDir = getExternalFilesDir("MyLogs");
// 路径示例:/storage/emulated/0/Android/data/你的包名/files/MyLogs
if (!privateLogDir.exists()) {
    privateLogDir.mkdirs();
}

// 配置Tinylog使用这个路径
FileWriterConfiguration fileConfig = new FileWriterConfiguration();
fileConfig.setFile(privateLogDir.getAbsolutePath() + "/app.log");
fileConfig.setAppend(true);
LoggingConfiguration.getInstance().addWriter(fileConfig);

这种方式既满足日志写入需求,又完全符合你"不需要任何文件权限"的要求。

备注:内容来源于stack exchange,提问作者user1047857

火山引擎 最新活动