Android SDK 30,写入外存根目录

Android SDK 30, write to the root of external storage


我有一个问题,我确定我不是唯一遇到的人。今天我为我的 Android 应用程序使用文件导出系统。我将导出文件写在与系统文件夹处于同一级别的文件夹中:

|-Android
|-Documents
|-Music
|-Downloads
|-MyApp
|- etc.

使用 SDK 30 的新存储系统,我无法再访问此文件夹。所以我被困在带有标志 "requestLegacyExternalStorage".

的 SDK 29 中

是否可以在根目录下创建 Android/data/com.mypackage 文件夹的快捷方式?

是否有解决此问题的软件包?两年来我一直在寻找解决这个问题的方法,但没有成功。我想将此文件夹保留在根目录中,因为它很容易访问,尤其是在 USB 传输期间。

我知道隐私政策,但这是针对专业应用程序的,他们不携带这个东西。

您可以针对 SDK 30 并向清单添加 MANAGE_EXTERNAL_STORAGE 权限:

 <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />

请注意这是一个危险的权限,因此您需要以不同的方式请求它,如下所示:

if (!Environment.isExternalStorageManager()) {
        requestManageAllPermission();
        return;
    }
private void requestManageAllPermission() {
    try {
        Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
        intent.addCategory("android.intent.category.DEFAULT");
        intent.setData(Uri.parse(String.format("package:%s", getApplicationContext().getPackageName())));
        startActivityForResult(intent, REQ_MANAGE_EXTERNAL);
    } catch (Exception e) {
       
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
        startActivityForResult(intent, REQ_MANAGE_EXTERNAL);
    }
}

并且您需要处理以下结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQ_MANAGE_EXTERNAL) {
        if (!Environment.isExternalStorageManager())
            finish();
    }
}

REQ_MANAGE_EXTERNAL 是一个 int 常量,可以是你想要的任何数字,在我的例子中是 2296