返回顶部
首页 > 资讯 > 移动开发 >Android11 open failed: EACCES (Permission denied)的解决方法
  • 907
分享到

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

androidkotlin开发语言 2023-09-21 16:09:16 907人浏览 安东尼
摘要

以下均用Kotlin编写,没用过的请酌情参考,方法类似 1、首先Manifest中添加权限 这是Manifest文件的开头     这两句必须加,但是上面那句会提示这样不能在谷歌商店上架,我自己编软件自己用所以不担心,如果

以下均用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、接下来,正常运行代码,打开应用后进行授权

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

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

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

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

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

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

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

亲测好用!(大佬果然还是大佬)(评论区的大佬也很强!)

来源地址:https://blog.csdn.net/ncm1584716/article/details/130559957

--结束END--

本文标题: Android11 open failed: EACCES (Permission denied)的解决方法

本文链接: https://lsjlt.com/news/414276.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作