当前位置:   article > 正文

Android11 open failed: EACCES (Permission denied)的解决方法_android open failed: eacces (permission denied)

android open failed: eacces (permission denied)

以下均用kotlin编写,没用过的请酌情参考,方法类似

1、首先Manifest中添加权限

这是Manifest文件的开头

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools">
  4. <!-- 必须要加下面两句-->
  5. <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
  6. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

 <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

这两句必须加,但是上面那句会提示这样不能在谷歌商店上架,我自己编软件自己用所以不担心,如果真要商用,建议还是老老实实存私有空间,Android11开始应用好像不能在公共空间操作了,需要用户手动设置。

2、动态获取权限

主Activity的class里定义

private val readRequest = android.Manifest.permission.READ_EXTERNAL_STORAGE

在主Activity中的onCreate的方法中

  1. val readFlag = ActivityCompat.checkSelfPermission(this,readRequest) != PackageManager.PERMISSION_GRANTED
  2. // var writeFlag = ActivityCompat.checkSelfPermission(this, writeContacts) != PackageManager.PERMISSION_GRANTED
  3. if(readFlag){
  4. if(ActivityCompat.shouldShowRequestPermissionRationale(this,readRequest)){
  5. //引导用户打开读取联系人权限
  6. }
  7. ActivityCompat.requestPermissions(this,
  8. arrayOf(readRequest),
  9. 100
  10. )
  11. }else{
  12. //getContacts()
  13. }

这个方法好像就是点开应用提示获取权限,当然这个权限是只能访问media文件(我不清楚这是什么类型的文件,就类似MP4格式?)

然后添加获取权限结果的函数,在onCreate方法外

当然我这里什么都没干,就弹了个提醒而已

  1. override fun onRequestPermissionsResult(
  2. requestCode: Int,
  3. permissions: Array<out String>,
  4. grantResults: IntArray
  5. ) {
  6. super.onRequestPermissionsResult(requestCode, permissions, grantResults)
  7. if (requestCode == 100) {
  8. if (grantResults.contains(PackageManager.PERMISSION_GRANTED)) {
  9. if (permissions.contains(readRequest)) {
  10. Toast.makeText(this,"成功",Toast.LENGTH_SHORT).show()
  11. }
  12. }
  13. }
  14. }

好的走到这里已经做完了网上搜到的90%的教程了,当然剩下还有什么在Manifest的<application>标签中添加

android:requestLegacyExternalStorage=“true”

android:preserveLegacyExternalStorage=“true”

之类的都在Android11不管用了,低于11的可以试试。

3、接下来,正常运行代码,打开应用后进行授权

 选择同意,之后切到后台,去系统设置进行手动用户授权

 之后切回app,就能正常使用外部公共空间了!

-----------------------------------------------------------------------------------------------------------------------

如果你看到了这里,那么你应该去看一下评论(不知道后面会不会没),评论大佬提到了一种Scoped Storage,去搜了一下发现有大佬详细解释了这种特性,

附上链接Android 11新特性,Scoped Storage又有了新花样_"tools:ignore=\"scopedstorage"_guolin的博客-CSDN博客

里面提到了获取权限的简单方法,不需要再像上面那样手动开启权限了,代码如下

  1. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R ||
  2. Environment.isExternalStorageManager()) {
  3. Toast.makeText(this, "已获得访问所有文件权限", Toast.LENGTH_SHORT).show()
  4. } else {
  5. val builder = AlertDialog.Builder(this)
  6. .setMessage("本程序需要您同意允许访问所有文件权限")
  7. .setPositiveButton("确定") { _, _ ->
  8. val intent = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)
  9. startActivity(intent)
  10. }
  11. builder.show()
  12. }

亲测好用!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/493556
推荐阅读
相关标签
  

闽ICP备14008679号