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

2024-04-09 1037阅读

温馨提示:这篇文章已超过396天没有更新,请注意相关的内容是否还可用!

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

1、首先Manifest中添加权限

这是Manifest文件的开头



    
    

 

 

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

2、动态获取权限

在主Activity的class里定义

private val readRequest = android.Manifest.permission.READ_EXTERNAL_STORAGE

在主Activity中的onCreate的方法中

val readFlag = ActivityCompat.checkSelfPermission(this,readRequest) != PackageManager.PERMISSION_GRANTED
//        var writeFlag = ActivityCompat.checkSelfPermission(this, writeContacts) != PackageManager.PERMISSION_GRANTED
            if(readFlag){
                if(ActivityCompat.shouldShowRequestPermissionRationale(this,readRequest)){
                    //引导用户打开读取联系人权限
                }
                ActivityCompat.requestPermissions(this,
                    arrayOf(readRequest),
                    100
                )
            }else{
                //getContacts()
            }

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

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

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

override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == 100) {
            if (grantResults.contains(PackageManager.PERMISSION_GRANTED)) {
                if (permissions.contains(readRequest)) {
                    Toast.makeText(this,"成功",Toast.LENGTH_SHORT).show()
                }
            }
        }
    }

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

android:requestLegacyExternalStorage=“true”

android:preserveLegacyExternalStorage=“true”

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

if (Build.VERSION.SDK_INT 
            val intent = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)
            startActivity(intent)
        }
    builder.show()
}

亲测好用!

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]