Android11 open failed: EACCES (Permission denied)的解决方法
短信预约 -IT技能 免费直播动态提醒
以下均用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
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341