电子说
Android 11对应的API为30,从这个版本起要想对外部存储进行写入操作的话需要比以往的操作多几个步骤,这里简单归纳下,具体的原因我就不多话了,具体步骤如下以供参考
1-在AndroidManifest.xml里这样注册权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
比以往多一条MANAGE_EXTERNAL_STORAGE
2-在AndroidManifest.xml的application下加入android:requestLegacyExternalStorage="true"
其实这句在API30下已经不起作用了,但在API29中还有作用,所以一并加上以免麻烦。
3-在代码中申请权限,由于这些新加的权限特殊,以往的申请方式不起作用,无论怎么申请,最后必然是授权失败。所以正确的方式就是先判断API的版本,如果大于等于30则用Environment.isExternalStorageManager()判断是否有授权,这个方法会返回一个布尔值,如是false就跳到一个特殊的页面让用户手动授权,跳转方法如下:
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.data = Uri.parse("package:" + requireActivity().packageName)
startActivity(intent) //startActivityForResult(intent,0x01)
由于这个授权界面是一个Activity,所以用startActivity还是startActivityForResult都可以,具体看你怎么利用生命周期了。
4-记得用传统方式申请下WRITE_EXTERNAL_STORAGE,以免产生不必要的麻烦。
到此,针对Android 11的外部存储的权限申请就这样了。最后说一下,虽然通过上述方式可以对整个外部存储空间进行文件的读写操作,但Android/data目录是个例外,此目录下保存着所有应用的专属空间,在Android11下已经不让访问了,但可以通过代码方式直接访问自己的那个目录。
全部0条评论
快来发表一下你的评论吧 !