通过在具有目标SDK 29的Android 10上启用旧版外部存储,确切地退出了范围存储的选择

问题描述

一个选项可以在定向到SDK 29时选择作用域存储。 通过在清单文件添加android:requestLegacyExternalStorage =“ true”来启用旧版存储。我的应用程序的现有功能无法在Android 10上运行。

例如

  1. 无法访问公共目录getExternalStorageDirectory()
  2. 无法调用mkdir()方法
  3. 无法通过DownloadManager等下载文件

我想通过启用旧版外部存储来确切选择退出范围存储。

根据我的理解,我们仍然必须在android 10上使用外部存储的新分类

用于存储路径的DownloadManager代码段:

DownloadManager.Request  request=new DownloadManager.Request(Download_Uri);
request.setDestinationInExternalPublicDir("/mappfolder/subdirectory",filename);

清单应用程序代码

<application
        android:requestLegacyExternalStorage="true"
        android:name=".base.module.view.MyApplication"
        android:allowBackup="false"
        android:icon="@drawable/im_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:networkSecurityConfig="@xml/network_security_config"
        android:supportsRtl="false"
        android:theme="@style/myThemeNOActionBar"
        tools:replace="android:supportsRtl"
        >

解决方法

getExternalStorageDirectory()在API 29中已弃用。使用getExternalFilesDir()。

如果使用旧版外部存储,则您的应用需要WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE之类的权限。但是很快将要实施范围存储,因此您应该更改代码以改为使用MediaStore API和/或Storage Access Framework。

,

通过启用旧存储,可以使用旧文件系统API在公共目录中创建特定于应用程序的目录,并访问公共存储以读取/写入文件。

但是使用DownloadManger,无法将应用程序特定的目录创建到公共存储中。