Android registerForActivityResult動(dòng)態(tài)申請(qǐng)權(quán)限案例詳解
前言
這幾天在做一個(gè)小工具app,結(jié)果在fragment里面動(dòng)態(tài)申請(qǐng)權(quán)限提示原有的申請(qǐng)方法已經(jīng)棄用,還畫了很明顯的刪除線。。。這叫一個(gè)強(qiáng)迫癥的我怎么受得了。趕緊網(wǎng)上找資料也找不出什么結(jié)果,看了官方文檔才發(fā)現(xiàn)了有registerForActivityResult這么一個(gè)神奇好用的函數(shù),可以代替我們現(xiàn)有的startActivityForResult和權(quán)限申請(qǐng)函數(shù)。
那么下面就分兩種情況來(lái)講一下如何使用這個(gè)函數(shù)動(dòng)態(tài)申請(qǐng)權(quán)限。
一、申請(qǐng)單個(gè)權(quán)限
首先,我們需要定義一個(gè)launcher:
ActivityResultLauncher<String> launcher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), result -> { if (result.equals(true)) { //權(quán)限獲取到之后的動(dòng)作 } else { //權(quán)限沒(méi)有獲取到的動(dòng)作 } });
上面代碼里的ActivityResultContracts.RequestPermission()就是告訴系統(tǒng)你要獲取權(quán)限,result是返回結(jié)果
可以看出只要權(quán)限獲取到了,這里result返回就是true,直接進(jìn)行判斷即可。
當(dāng)然,只定義了這個(gè)launcher系統(tǒng)是不會(huì)執(zhí)行的,因?yàn)檫@只是一個(gè)注冊(cè)函數(shù),還要在你需要執(zhí)行的地方加入如下的代碼:
button.setOnClickListener(view -> { launcher.launch(Manifest.permission.READ_EXTERNAL_STORAGE); });
完成后當(dāng)你點(diǎn)擊這個(gè)button的時(shí)候,就會(huì)跳出申請(qǐng)讀存儲(chǔ)權(quán)限的提示。
二、獲取多個(gè)權(quán)限
這里我以同時(shí)獲取拍照和存儲(chǔ)兩個(gè)權(quán)限為例,三個(gè)及以上的原理類似。
和獲取單個(gè)權(quán)限一樣,獲取多個(gè)權(quán)限也需要定義一個(gè)launcher:
ActivityResultLauncher<String[]> launcher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), result -> { if (result.get(Manifest.permission.CAMERA) != null && result.get(Manifest.permission.READ_EXTERNAL_STORAGE) != null) { if (Objects.requireNonNull(result.get(Manifest.permission.CAMERA)).equals(true) && Objects.requireNonNull(result.get(Manifest.permission.READ_EXTERNAL_STORAGE)).equals(true)) { //權(quán)限全部獲取到之后的動(dòng)作 } else { //有權(quán)限沒(méi)有獲取到的動(dòng)作 } } });
和單個(gè)權(quán)限不同的是,多個(gè)權(quán)限傳入的方法是ActivityResultContracts.RequestMultiplePermissions()。ActivityResultLauncher里面帶的是一個(gè)string數(shù)組。返回值result的類型是map(樣例如下表)。
申請(qǐng)的權(quán)限(String) | 權(quán)限的申請(qǐng)結(jié)果(boolean) |
---|---|
Manifest.permission.CAMERA | true/false |
Manifest.permission.READ_EXTERNAL_STORAGE | true/false |
所以直接使用map里的get方法就可以獲取每個(gè)權(quán)限對(duì)應(yīng)的結(jié)果。我以為就這樣結(jié)束了,結(jié)果編譯器在我get方法這里畫了黃黃的底色,一看提示說(shuō)可能導(dǎo)致空指針異常。所以我就多加了Objects.requireNonNull,警告馬上消失。
最后一步同樣不能少,在需要獲取權(quán)限的地方執(zhí)行一下launch方法:
launcher.launch(new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE})
三、總結(jié)
registerForActivityResult真的是個(gè)很好用的函數(shù),要不是提示我之前的被棄用了我可能一直都不知道,不光可以代替獲取權(quán)限方法,startActivityForResult方法也可以替換為這個(gè)函數(shù)。
到此這篇關(guān)于Android registerForActivityResult動(dòng)態(tài)申請(qǐng)權(quán)限案例詳解的文章就介紹到這了,更多相關(guān)Android registerForActivityResult動(dòng)態(tài)申請(qǐng)權(quán)限內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android6.0動(dòng)態(tài)申請(qǐng)權(quán)限所遇到的問(wèn)題小結(jié)
- Android中不支持動(dòng)態(tài)申請(qǐng)權(quán)限的原因
- Android 如何實(shí)現(xiàn)動(dòng)態(tài)申請(qǐng)權(quán)限
- android6.0權(quán)限動(dòng)態(tài)申請(qǐng)框架permissiondispatcher的方法
- android12?SD如何動(dòng)態(tài)申請(qǐng)讀寫權(quán)限
- Android14 、15動(dòng)態(tài)申請(qǐng)讀寫權(quán)限實(shí)現(xiàn)方法示例代碼 (Java)
相關(guān)文章
Android自定義ViewGroup之第一次接觸ViewGroup
這篇文章主要為大家詳細(xì)介紹了Android自定義ViewGroup之第一次接觸ViewGroup,感興趣的小伙伴們可以參考一下2016-06-06Android?studio實(shí)現(xiàn)單選按鈕
這篇文章主要為大家詳細(xì)介紹了Android?studio實(shí)現(xiàn)單選按鈕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05簡(jiǎn)介Android應(yīng)用中sharedPreferences類存儲(chǔ)數(shù)據(jù)的用法
這篇文章主要介紹了Android應(yīng)用中使用sharedPreferences類存儲(chǔ)數(shù)據(jù)的方法,文中舉了用SharedPreferences保存數(shù)據(jù)和讀取數(shù)據(jù)的例子,需要的朋友可以參考下2016-02-02Android利用listview控件操作SQLite數(shù)據(jù)庫(kù)實(shí)例
我們利用SQLiteOpenHelper類建立一個(gè)數(shù)據(jù)庫(kù),并寫好增、刪、查等方法,通過(guò)SimpleCursorAdapter連接listview實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增加、查詢以及長(zhǎng)按刪除的功能。2017-04-04Android ViewPager撤消左右滑動(dòng)切換功能實(shí)現(xiàn)代碼
這篇文章主要介紹了Android ViewPager撤消左右滑動(dòng)切換功能實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-04-04Android編寫文件瀏覽器簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android編寫文件瀏覽器簡(jiǎn)單實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11