以下均用kotlin編寫,沒用過的請酌情參考,方法類似
1、首先Manifest中添加權限
這是Manifest文件的開頭
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- 必須要加下面兩句-->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<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、動態(tài)獲取權限
在主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)){
//引導用戶打開讀取聯(lián)系人權限
}
ActivityCompat.requestPermissions(this,
arrayOf(readRequest),
100
)
}else{
//getContacts()
}
這個方法好像就是點開應用提示獲取權限,當然這個權限是只能訪問media文件(我不清楚這是什么類型的文件,就類似MP4格式?)
然后添加獲取權限結果的函數(shù),在onCreate方法外
當然我這里什么都沒干,就彈了個提醒而已
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
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()
}
}
}
}
好的走到這里已經(jīng)做完了網(wǎng)上搜到的90%的教程了,當然剩下還有什么在Manifest的<application>標簽中添加
android:requestLegacyExternalStorage=“true”
android:preserveLegacyExternalStorage=“true”
之類的都在Android11不管用了,低于11的可以試試。
3、接下來,正常運行代碼,打開應用后進行授權
?選擇同意,之后切到后臺,去系統(tǒng)設置進行手動用戶授權
?之后切回app,就能正常使用外部公共空間了!
-----------------------------------------------------------------------------------------------------------------------文章來源:http://www.zghlxwxcb.cn/news/detail-705690.html
如果你看到了這里,那么你應該去看一下評論(不知道后面會不會沒),評論大佬提到了一種Scoped Storage,去搜了一下發(fā)現(xiàn)有大佬詳細解釋了這種特性,
附上鏈接Android 11新特性,Scoped Storage又有了新花樣_"tools:ignore=\"scopedstorage"_guolin的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-705690.html
里面提到了獲取權限的簡單方法,不需要再像上面那樣手動開啟權限了,代碼如下
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()
}
親測好用!
到了這里,關于Android11 open failed: EACCES (Permission denied)的解決方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!