一、问题场景
在Android 10及以上系统的手机上测试发现,明明已经申请了 android.permission.READ_EXTERNAL_STORAGE
和 android.permission.WRITE_EXTERNAL_STORAGE
权限,且应用也拥有了这些权限,但应用只能读写 Context.getExternalxxxDir()
获取到的目录,而无法读写 /sdcard 下的其余文件。
这是由于 Android 在 10 之后又加强了数据隐私管理,可以把 Context.getExternalxxxDir()
获取到的目录理解为应用独有的一个空间,新的 Android 系统不希望应用直接访问这个空间外的数据。
二、问题解决
如果我们应用依旧希望访问 /sdcard 中应用空间外的其余文件,可以在 AndroidManifest.xml 中的 application 标签中添加一条 android:requestLegacyExternalStorage=“true” 即可。
示例:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>