Android10 以及以上的版本提供了分区存储机制,为了让用户更好地管理自己的文件并减少混乱,此类应用只能访问外部存储空间上的应用专属目录,以及本应用所创建的特定类型的媒体文件。简单解释就是:Android 10 开启分区存储后,应用在有权限的情况下也无法随便访问其他外部存储空间中的公有文件夹了,应该怎么办呢?
不同版本不同方式
根据应用在哪个 Android 版本上运行来纳入逻辑。
Android 11
使用 MediaStore.createWriteRequest () 或 MediaStore.createTrashRequest () 为应用的写入或删除请求创建待定 intent,然后通过调用该 intent 提示用户授予修改一组文件的权限。
评估用户的响应:
- 如果授予了权限,请继续修改或删除操作。
- 如果未授予权限,请向用户说明您的应用中的功能为何需要该权限。
如需访问系统为您的应用提供的目录,请调用 getExternalFilesDirs ()
)。
Android 10
如果您的应用以 Android 10(API 级别 29)为目标平台,请停用分区存储,继续使用适用于 Android 9 及更低版本的方法来执行此操作,设置 requestLegacyExternalStorage 为 true 即可。
1
| requestLegacyExternalStorage = true
|
<= Android 9
按照请求应用权限中所述的最佳做法,请求 WRITE_EXTERNAL_STORAGE 权限。使用 MediaStore API 修改或删除媒体文件。
常用模板代码
下面是申请存储权限时用到的一些模板代码。
AndroidManifest.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application android:requestLegacyExternalStorage="true" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Mp3Encode"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
</manifest>
|
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private static final int REQUEST_EXTERNAL_STORAGE = 1001;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); verifyStoragePermissions (this); }
public static void verifyStoragePermissions(Activity activity) { int writePermission = ActivityCompat.checkSelfPermission (activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); int readPermission = ActivityCompat.checkSelfPermission (activity, Manifest.permission.READ_EXTERNAL_STORAGE);
if (writePermission != PackageManager.PERMISSION_GRANTED || readPermission != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions ( activity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_EXTERNAL_STORAGE ); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String [] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult (requestCode, permissions, grantResults); if(REQUEST_EXTERNAL_STORAGE == requestCode){ } } }
|
对,就这么简单~