You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 13设备写入权限被拒问题求助(时间监控系统开发)

解决Android 13写入文件权限被拒问题

一、权限适配核心要点

Android 13(API 33)彻底废弃了WRITE_EXTERNAL_STORAGE权限,针对不同存储场景有明确规则:

  • 应用专属文件:无需申请任何权限,直接通过应用专属目录读写
  • 公共目录文件:普通文本文件无法再通过传统权限静默写入,需使用存储访问框架(SAF)让用户主动授权

二、最优解决方案(应用专属目录)

1. 调整AndroidManifest.xml

移除过时的写入权限,若需兼容Android 12及以下版本,可添加版本限制:

<!-- 移除无意义的WRITE_EXTERNAL_STORAGE(Android 13+无效) -->
<!-- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> -->
<!-- 仅为Android 12及以下版本保留权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

2. 修改MainActivity.java的文件写入逻辑

将文件路径改为应用专属外部存储目录,无需权限即可写入:

// 获取应用专属外部存储目录,文件路径为:Android/data/你的包名/files/time_monitoring.txt
File logFile = new File(getExternalFilesDir(null), "time_monitoring.txt");

// 生成时间记录文本
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.getDefault());
String currentRecord = (isTimeIn ? "Time In" : "Time Out") + ": " + dateFormat.format(new Date()) + "\n";

// 追加写入文件
try (FileWriter writer = new FileWriter(logFile, true)) {
    writer.write(currentRecord);
    Toast.makeText(this, "记录已保存", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
    e.printStackTrace();
    Toast.makeText(this, "写入失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
}

3. 方案优势

  • 完全规避权限申请流程,不会出现权限被拒的问题
  • 文件随应用卸载自动删除,符合系统数据管理规范
  • 读写效率更高,无系统额外限制

三、若需写入公共目录(如Downloads)

如果必须将文件放在公共目录,需通过存储访问框架让用户主动选择文件:

// 启动文件创建选择器
private static final int CREATE_FILE_REQUEST = 1001;

private void createPublicLogFile() {
    Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_TITLE, "time_monitoring.txt");
    startActivityForResult(intent, CREATE_FILE_REQUEST);
}

// 处理选择结果并写入
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CREATE_FILE_REQUEST && resultCode == RESULT_OK && data != null) {
        Uri fileUri = data.getData();
        try (OutputStream outputStream = getContentResolver().openOutputStream(fileUri, "wa")) {
            String record = "Time In: " + new SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.getDefault()).format(new Date()) + "\n";
            outputStream.write(record.getBytes());
            Toast.makeText(this, "记录已保存到公共目录", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注意:此方式必须由用户手动选择文件位置,无法静默写入公共目录,这是Android 13隐私保护的强制要求。

内容的提问来源于stack exchange,提问作者Rovic Balingbing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:55:10