網(wǎng)站首頁 編程語言 正文
?升級(jí)到11后
targetSdkVersion 30
?權(quán)限又原來的兩個(gè)變?yōu)榱巳齻€(gè)
在原先的基礎(chǔ)上面新增了這個(gè)全新啊
MANAGE_EXTERNAL_STORAGE
?
這個(gè)權(quán)限的目的是為了
該權(quán)限將授權(quán)讀寫所有共享存儲(chǔ)內(nèi)容,這也將同時(shí)包含非媒體類型的文件。但是獲得這個(gè)權(quán)限的應(yīng)用還是無法訪問其他應(yīng)用的應(yīng)用專屬目錄 (app-specific directory),無論是外部存儲(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的那么就還是按照原來的去申請(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) {
// 先判斷有沒有權(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) {
// 先判斷有沒有權(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)限獲取失敗");
}
}
}
/**
* 模擬文件寫入
*/
private void writeFile() {
ToastUtils.show("寫入文件成功");
}
}
XXPermissions 提供了簡(jiǎn)單的權(quán)限申請(qǐng)。
// JitPack 遠(yuǎn)程倉庫: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í)候就可以彈出如上代碼
我們沒有對(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-07-19 C++分別使用std::chrono和clock()計(jì)算時(shí)間間隔
- 2022-02-28 ts-node : 無法加載文件 C:\Users\Dell\AppData\Roaming\npm
- 2022-01-20 console基礎(chǔ)用法,輸出添加css,打印時(shí)間差,計(jì)數(shù)等
- 2022-08-15 Android?Gradle模塊依賴替換使用技巧_Android
- 2022-12-19 Python?完美解決?Import?“模塊“?could?not?be?resolved?...的
- 2022-04-18 Python?變量類型實(shí)例詳解_python
- 2022-06-01 Python學(xué)習(xí)之虛擬環(huán)境原理詳解_python
- 2022-10-22 Kotlin線程的橋接與切換使用介紹_Android
- 最近更新
-
- 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)證過濾器
- 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)程分支