網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
?升級(jí)到11后
targetSdkVersion 30
?權(quán)限又原來(lái)的兩個(gè)變?yōu)榱巳齻€(gè)
在原先的基礎(chǔ)上面新增了這個(gè)全新啊
MANAGE_EXTERNAL_STORAGE
?
這個(gè)權(quán)限的目的是為了
該權(quán)限將授權(quán)讀寫(xiě)所有共享存儲(chǔ)內(nèi)容,這也將同時(shí)包含非媒體類型的文件。但是獲得這個(gè)權(quán)限的應(yīng)用還是無(wú)法訪問(wèn)其他應(yīng)用的應(yīng)用專屬目錄 (app-specific directory),無(wú)論是外部存儲(chǔ)還是內(nèi)部存儲(chǔ)。
但是這個(gè)MANAGE_EXTERNAL_STORAGE權(quán)限和存儲(chǔ)的倆權(quán)限 授權(quán)其中一個(gè)就好了。。不然還會(huì)報(bào)錯(cuò)
所以正確做法應(yīng)當(dāng)是。android11申請(qǐng)11的權(quán)限。低于11的那么就還是按照原來(lái)的去申請(qǐng)
public final class PermissionActivity extends AppCompatActivity {
private static final int REQUEST_CODE = 1024;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestPermission();
}
private void requestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// 先判斷有沒(méi)有權(quán)限
if (Environment.isExternalStorageManager()) {
writeFile();
} else {
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.setData(Uri.parse("package:" + context.getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 先判斷有沒(méi)有權(quán)限
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
writeFile();
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
}
} else {
writeFile();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
writeFile();
} else {
ToastUtils.show("存儲(chǔ)權(quán)限獲取失敗");
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
writeFile();
} else {
ToastUtils.show("存儲(chǔ)權(quán)限獲取失敗");
}
}
}
/**
* 模擬文件寫(xiě)入
*/
private void writeFile() {
ToastUtils.show("寫(xiě)入文件成功");
}
}
XXPermissions 提供了簡(jiǎn)單的權(quán)限申請(qǐng)。
// JitPack 遠(yuǎn)程倉(cāng)庫(kù):https://jitpack.io
maven { url 'https://jitpack.io' }
api 'com.github.getActivity:XXPermissions:13.5'
申請(qǐng)這個(gè)權(quán)限就不用申請(qǐng)其他的了
?這個(gè)jetpck的插件幫我們完成了
val permission0 = Permission.ACCESS_FINE_LOCATION;
val permission2 = Permission.READ_PHONE_STATE;
val permission3 = Permission.MANAGE_EXTERNAL_STORAGE;
if (XXPermissions.isGranted(activity, permission0, permission2, permission3)
) {
onOver()
return
}
XXPermissions.with(activity)
// 申請(qǐng)單個(gè)權(quán)限
.permission(permission0)
// 申請(qǐng)多個(gè)權(quán)限
.permission(permission2)
.permission(permission3)
// 設(shè)置權(quán)限請(qǐng)求攔截器(局部設(shè)置)
//.interceptor(new PermissionInterceptor())
// 設(shè)置不觸發(fā)錯(cuò)誤檢測(cè)機(jī)制(局部設(shè)置)
//.unchecked()
.request(object : OnPermissionCallback {
override fun onGranted(permissions: MutableList, all: Boolean) {
}
override fun onDenied(
permissions: MutableList,
never: Boolean
) {
}
})
在對(duì)應(yīng)多個(gè)權(quán)限申請(qǐng)的時(shí)候就可以彈出如上代碼
我們沒(méi)有對(duì)android12
做判斷。但是框架為我們做了。
參考?2022-02-24 Android R11 之后外部存儲(chǔ)權(quán)限獲取,Android R11 里將會(huì)引入一個(gè)特別的權(quán)限叫做 MANAGE_EXTERNAL_STORAGE,跟之前的版本有區(qū)別。_海月汐辰的博客-CSDN博客_manage_external_storage
Android 11 存儲(chǔ)權(quán)限適配指南_雪舞飛影的博客-CSDN博客_android 存儲(chǔ)權(quán)限?
GitHub - getActivity/XXPermissions: Android 權(quán)限請(qǐng)求框架,已適配 Android 12
原文鏈接:https://blog.csdn.net/mp624183768/article/details/124672782
相關(guān)推薦
- 2022-01-31 RuntimeError:Given input size:(256x1x1). Calculate
- 2022-07-11 UVM中超時(shí)退出set_timeout函數(shù)
- 2022-08-05 C語(yǔ)言超詳細(xì)講解宏與指針的使用_C 語(yǔ)言
- 2022-11-02 Mango?Cache緩存管理庫(kù)TinyLFU源碼解析_Golang
- 2022-08-23 多線程python的實(shí)現(xiàn)及多線程有序性_python
- 2022-10-29 在Centos8中安裝配置Redis,實(shí)現(xiàn)遠(yuǎn)程訪問(wèn)
- 2022-10-16 Python使用random.shuffle()隨機(jī)打亂字典排序_python
- 2022-06-29 C語(yǔ)言超詳細(xì)講解遞歸算法漢諾塔_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支