android許可權申請工具類

android6.0之後危險類的許可權是需要申請使用者確認後才能使用該許可權的,下面寫出許可權申請的工具類,可申請一個許可權或同時申請多個許可權,可以是在Activity呼叫也可在fragment中呼叫。

程式碼如下:CheckPermission

package com。antbyte。video。utils; import android。annotation。TargetApi;import android。app。Activity;import android。app。AlertDialog;import android。content。DialogInterface;import android。content。Intent;import android。content。pm。PackageManager;import android。net。Uri;import android。os。Build;import android。provider。Settings;import android。support。v4。app。ActivityCompat;import android。support。v4。app。Fragment;import android。support。v4。content。ContextCompat; import com。antbyte。video。MyApp;import com。antbyte。video。R;import com。antbyte。video。activities。MainActivity; import java。util。ArrayList;import java。util。List; /** * Created by yangjianli on 2016/4/5 0005。 */public class CheckPermission { private static final String PACKAGE_URL_SCHEME = “package:”; // 方案 /** * 6。0以上:activity單個許可權申請 * @param context * @param permissionName * @param requstCode * @return */ public static boolean requestPermission(Activity context, String permissionName, int requstCode) { if (ContextCompat。checkSelfPermission(context, permissionName) != PackageManager。PERMISSION_GRANTED) { ActivityCompat。requestPermissions(context, new String[]{permissionName}, requstCode); return false; } else { return true; } } /** * 6。0以上:activity多個許可權申請 * @param context * @param permissions * @param requstCode * @return */ public static boolean requestPermissions(Activity context, List permissions, int requstCode){ List needRequetPermissions = new ArrayList<>(); for(int i = 0;i < permissions。size();i++){ String permission = permissions。get(i); if(ContextCompat。checkSelfPermission(context, permission) != PackageManager。PERMISSION_GRANTED){ needRequetPermissions。add(permission); } } int requestPermissionCount = needRequetPermissions。size(); if(requestPermissionCount > 0){ String[]requestPermissions = new String[requestPermissionCount]; for(int i = 0;i < requestPermissionCount;i++){ requestPermissions[i] = needRequetPermissions。get(i); } ActivityCompat。requestPermissions(context, requestPermissions, requstCode); return false; }else{ return true; } } /** *:6。0以上:fragment的單個許可權申請 * @param activity * @param fragment * @param permissionName * @param requstCode * @return */ @TargetApi(Build。VERSION_CODES。M) public static boolean requestPermissionFragment(Activity activity, Fragment fragment, String permissionName, int requstCode) { if (ContextCompat。checkSelfPermission(activity, permissionName) != PackageManager。PERMISSION_GRANTED) { fragment。requestPermissions(new String[]{permissionName}, requstCode); return false; } else { return true; } } /** *:6。0以上:fragment的多個許可權申請 * @param activity * @param fragment * @param permissions * @param requstCode * @return */ @TargetApi(Build。VERSION_CODES。M) public static boolean requestPermissionFragments(Activity activity, Fragment fragment, List permissions, int requstCode) { List needRequetPermissions = new ArrayList<>(); for(int i = 0;i < permissions。size();i++){ String permission = permissions。get(i); if(ContextCompat。checkSelfPermission(activity, permission) != PackageManager。PERMISSION_GRANTED){ needRequetPermissions。add(permission); } } int requestPermissionCount = needRequetPermissions。size(); if(requestPermissionCount > 0){ String[]requestPermissions = new String[requestPermissionCount]; for(int i = 0;i < requestPermissionCount;i++){ requestPermissions[i] = needRequetPermissions。get(i); } fragment。requestPermissions(requestPermissions, requstCode); return false; }else{ return true; } } // 顯示缺失許可權提示 public static void showMissingPermissionDialog(final Activity context, String permission) { AlertDialog。Builder builder = new AlertDialog。Builder(context); builder。setTitle(context。getResources()。getString(R。string。dialog_permission_title)); builder。setMessage(“由於”+ MyApp。mApp。getResources()。getString(R。string。app_name)+“不能獲取裝置資訊的許可權,不能正常執行,請設定” + permission + “許可權後使用。設定路徑:系統設定->”+ MyApp。mApp。getResources()。getString(R。string。app_name)+“->許可權”); builder。setCancelable(false); // 拒絕, 退出應用 builder。setNegativeButton(context。getResources()。getString(R。string。dialog_permission_negative), new DialogInterface。OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(context, MainActivity。class); intent。putExtra(“EXIT_TAG”, “SINGLETASK”); context。startActivity(intent); } }); builder。setPositiveButton(context。getResources()。getString(R。string。dialog_permission_positive), new DialogInterface。OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { goSetting(context); } }); builder。show(); } //去應用手動設定許可權 public static void goSetting(Activity context){ Intent intent = new Intent(Settings。ACTION_APPLICATION_DETAILS_SETTINGS); intent。setData(Uri。parse(PACKAGE_URL_SCHEME + context。getPackageName())); context。startActivity(intent); }}

最後入過使用者不同意則提示使用者去設定中開啟許可權。

申請的程式碼示例:

private void goCapture() { List strings = new ArrayList<>(); strings。add(Manifest。permission。READ_EXTERNAL_STORAGE); strings。add(Manifest。permission。WRITE_EXTERNAL_STORAGE); strings。add(Manifest。permission。CAMERA); if (CheckPermission。requestPermissions(this, strings, 1)) { //已經擁有許可權後執行的操作 } }

許可權申請的回撥如下:

@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { LogUtil。e(“requestCode”, “requestCode” + requestCode); switch (requestCode) { case 1: { // If request is cancelled, the result arrays are empty。 if (grantResults。length > 0 && grantResults[0] == PackageManager。PERMISSION_GRANTED) { //使用者同意了許可權請求後的操作 } else { CheckPermission。showMissingPermissionDialog(CreateVideoActivity。this, “相機”); } } break; } }