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

