Android registerForActivityResult動態申請權限案例詳解
前言
這幾天在做一個小工具app,結果在fragment裡面動態申請權限提示原有的申請方法已經棄用,還畫瞭很明顯的刪除線。。。這叫一個強迫癥的我怎麼受得瞭。趕緊網上找資料也找不出什麼結果,看瞭官方文檔才發現瞭有registerForActivityResult這麼一個神奇好用的函數,可以代替我們現有的startActivityForResult和權限申請函數。
那麼下面就分兩種情況來講一下如何使用這個函數動態申請權限。
一、申請單個權限
首先,我們需要定義一個launcher:
ActivityResultLauncher<String> launcher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), result -> { if (result.equals(true)) { //權限獲取到之後的動作 } else { //權限沒有獲取到的動作 } });
上面代碼裡的ActivityResultContracts.RequestPermission()就是告訴系統你要獲取權限,result是返回結果
可以看出隻要權限獲取到瞭,這裡result返回就是true,直接進行判斷即可。
當然,隻定義瞭這個launcher系統是不會執行的,因為這隻是一個註冊函數,還要在你需要執行的地方加入如下的代碼:
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數組。返回值result的類型是map(樣例如下表)。
申請的權限(String) | 權限的申請結果(boolean) |
---|---|
Manifest.permission.CAMERA | true/false |
Manifest.permission.READ_EXTERNAL_STORAGE | true/false |
所以直接使用map裡的get方法就可以獲取每個權限對應的結果。我以為就這樣結束瞭,結果編譯器在我get方法這裡畫瞭黃黃的底色,一看提示說可能導致空指針異常。所以我就多加瞭Objects.requireNonNull,警告馬上消失。
最後一步同樣不能少,在需要獲取權限的地方執行一下launch方法:
launcher.launch(new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE})
三、總結
registerForActivityResult真的是個很好用的函數,要不是提示我之前的被棄用瞭我可能一直都不知道,不光可以代替獲取權限方法,startActivityForResult方法也可以替換為這個函數。
到此這篇關於Android registerForActivityResult動態申請權限案例詳解的文章就介紹到這瞭,更多相關Android registerForActivityResult動態申請權限內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Android permission denied原因歸納和解決辦法
- Android權限詢問的實例詳解
- Android11及以上文件讀寫權限申請詳細介紹
- Android開發之permission動態權限獲取詳解
- Android在一個app中安裝並卸載另一個app的示例代碼