Android6.0 申請許可權比較優雅的處理方法
阿新 • • 發佈:2018-12-29
android6.0以後許可權的申請改成了動態申請,如果你的targetSdkVersion 大於23且手機系統是6.0以上的就會變成動態申請.為了專案的需求我自己整理了一套許可權申請的方法.先上幾張圖片.
1.這是我第一次執行專案彈出許可權請求的介面,我都選擇了不允許,然後會通過Snackbar友好的提醒使用者需要允許許可權
2.當我第二次在點選拍照時,就會先彈出一個Snackbar告訴使用者,我需要一些許可權,這次我還是決絕而且還點選了不再提醒.這樣使用者下次在點選拍照時就無法彈出申請許可權的介面了,這裡我就通過Snackbar提醒使用者是否要去設定介面開啟許可權
3.這是我選擇了不再詢問以後再次點選拍照的時候,這時就會直接彈出Snackbar提醒使用者是否要去設定介面開啟許可權
通過上面的圖片效果,應該可以看出這套許可權請求的過程了,下面我就貼一下程式碼.
1.我把許可權請求封裝到了一個工具類中,程式碼如下
`public class PermissionUtil {
/** * 檢測許可權 * @param activity * @param view //隨便一個view 來用顯示snackbar * @param permissions //請求的許可權組 * @param requestCode //請求碼 */ public static void checkPermission(final Activity activity,View view, final String[] permissions, final int requestCode,permissionInterface permissionInterface) { //小於23 就什麼都不做 if (Build.VERSION.SDK_INT < 23) { return; } List<String> deniedPermissions = findDeniedPermissions(activity, permissions); if (deniedPermissions!=null&&deniedPermissions.size()>0) { //大於0,表示有許可權沒申請 PermissionUtil.requestContactsPermissions(activity, view, deniedPermissions.toArray(new String[deniedPermissions.size()]), requestCode); } else { //擁有許可權 permissionInterface.success(); } } /** * 請求許可權 */ public static void requestContactsPermissions(final Activity activity,View view, final String[] permissions, final int requestCode) { //預設是false,但是隻要請求過一次許可權就會為true,除非點了不再詢問才會重新變為false if (shouldShowPermissions(activity,permissions)) { Snackbar.make(view, "需要一些許可權", Snackbar.LENGTH_INDEFINITE) .setAction("確定", new View.OnClickListener() { @Override public void onClick(View view) { ActivityCompat .requestPermissions(activity, permissions, requestCode); } }) .show(); } else { // 無需向用戶介面提示,直接請求許可權,如果使用者點了不再詢問,即使呼叫請求許可權也不會出現請求許可權的對話方塊 ActivityCompat.requestPermissions(activity, permissions, requestCode); } } /** * 判斷請求許可權是否成功 * @param grantResults * @return */ public static boolean verifyPermissions(int[] grantResults) { // At least one result must be checked. if(grantResults.length < 1){ return false; } // Verify that each required permission has been granted, otherwise return false. for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { return false; } } return true; } //回撥介面 public interface permissionInterface{ void success(); } /** * 找到沒有授權的許可權 * @param activity * @param permission * @return */ public static List<String> findDeniedPermissions(Activity activity, String... permission) { //儲存沒有授權的許可權 List<String> denyPermissions = new ArrayList<>(); for (String value : permission) { if (ContextCompat.checkSelfPermission(activity,value) != PackageManager.PERMISSION_GRANTED) { //沒有許可權 就新增 denyPermissions.add(value); } } return denyPermissions; } /** * 檢測這些許可權中是否有 沒有授權需要提示的 * @param activity * @param permission * @return */ public static boolean shouldShowPermissions(Activity activity, String... permission) { for (String value : permission) { if (ActivityCompat.shouldShowRequestPermissionRationale(activity, value)) { return true; } } return false; }
}`
2.下面在貼一下使用的程式碼
在需要許可權請求的地方呼叫如下方法就可以開啟許可權請求
/**
* 請求拍照的許可權
* 第二個引數表示一個view ,可以隨便傳入一個
* 第三個表示 請求的許可權陣列
* 第4個是請求碼
* 第5個是回撥介面
*/
private void requestPermiss() {
PermissionUtil.checkPermission(getmActivity(), linearAddbankcard2Bankcard, REQUEST_PERMISSIONS, REQUEST_PERMISSION_CODE_TAKE_PIC, new PermissionUtil.permissionInterface() {
@Override
public void success() {
UtilMethod.paizhao(getmActivity(), Constants.PHOTOHRAPH);
}
});
}
但是還得需要重寫下面的方法來判斷許可權是否開啟成功,並且做相應的處理
/**
* 檢測許可權的回撥
*
* @param requestCode
* @param permissions
* @param grantResults
*/
public void onRequestPermissionsResult(int requestCode, final String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_PERMISSION_CODE_TAKE_PIC) {
if (PermissionUtil.verifyPermissions(grantResults)) {//有許可權
ImageTools.paizhao(getmActivity(), Constants.PHOTOHRAPH);
} else {
//沒有許可權
if (!PermissionUtil.shouldShowPermissions(this,permissions)) {//這個返回false 表示勾選了不再提示
showSnackBar(linearAddbankcard2Bankcard, "請去設定介面設定許可權","去設定");
} else {
//表示沒有許可權 ,但是沒勾選不再提示
showSnackBar(linearAddbankcard2Bankcard, "請允許許可權請求!");
}
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
重寫下面的方法為了判斷, 使用者去設定介面是否開啟了許可權
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//如果是從設定介面返回,就繼續判斷許可權
if (requestCode == REQUEST_PERMISSION_SEETING) {
requestPermiss();
}
}
3.這時去設定介面的程式碼
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_PERMISSION_SEETING);
4.最後提點小建議,最好在申請許可權的程式碼用try catch 住,防止有些廠家修改了系統出現未知的BUG,為了方便使用,我封裝了一個請求許可權的庫,使用非常簡單, 一行呼叫程式碼即可.具體的參考請求許可權的庫