在android 6.0開始,部分的權限需要我們動態申請,也就是說當我們的打開app的時候系統不會主動像您申請app所需要的部分權限,需要客戶在使用app的時候主動的去申請。
一、權限的申請兩步驟:
1、權限申請:
/** * @param permissions需要申請的權限 * @param requestCode申請回調code */ public static void requestPermissions(final @NonNull Activity activity,final @NonNullString[] permissions, final int requestCode)
2、申請回調處理:
/** *@param requestCode申請回調code *@param permissions申請的權限 *@param grantResults返回申請狀態PackageManager#PERMISSION_GRANTED(授予) PackageManager#PERMISSION_DENIED(拒絕) */ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
二、Fragment中運行時權限的特殊處理
在Fragment中申請權限,不要使用ActivityCompat.requestPermissions, 直接使用Fragment的requestPermissions方法,否則會回調到Activity的onRequestPermissionsResult如果在Fragment中嵌套Fragment,在子Fragment中使用requestPermissions方 法,onRequestPermissionsResult不會回調回來,建議使用 getParentFragment().requestPermissions方法,
這個方法會回調到父Fragment中的onRequestPermissionsResult,加入以下代碼可以把回調透傳到子Fragment
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); List fragments = getChildFragmentManager().getFragments(); if (fragments != null) { for (Fragment fragment : fragments) { if (fragment != null) { fragment.onRequestPermissionsResult(requestCode,permissions,grantResults); } } }}三、權限申請的簡單封裝
public class RequestPermissions { public static intREQUEST_EXTERNAL_STORAGE = 1; public static String[]PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; /** *讀寫權限申請回調true有權限false無權限 * * @param mContext */ public static voidwriteExternalStorage(final Context mContext, PermissionCallBack mCallBack) { //檢查是否擁有相應的權限 int permission =ActivityCompat.checkSelfPermission(mContext,Manifest.permission.WRITE_EXTERNAL_STORAGE); //沒有權限發起申請 if (permission !=PackageManager.PERMISSION_GRANTED) { //6.0及以上版本才需要申請權限 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) ActivityCompat.requestPermissions((Activity) mContext,PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE); else { mCallBack.setOnPermissionListener(false); } } else { mCallBack.setOnPermissionListener(true); } } /** *讀寫權限申請回調true有權限false無權限 * * @param mContext */ public static voidwriteExternalStorage(final Context mContext, PermissionCallBack mCallBack, intrequestCode) { //檢查是否擁有相應的權限 int permission =ActivityCompat.checkSelfPermission(mContext,Manifest.permission.WRITE_EXTERNAL_STORAGE); //沒有權限發起申請 if (permission !=PackageManager.PERMISSION_GRANTED) { //6.0及以上版本才需要申請權限 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) ActivityCompat.requestPermissions((Activity) mContext,PERMISSIONS_STORAGE,requestCode); else { mCallBack.setOnPermissionListener(false); } } else { mCallBack.setOnPermissionListener(true); } } /** *權限申請回調,需要在你調用的Activity中onRequestPermissionsResult調用該方法true申請權限成功false申請權限失敗 * * @param requestCode * @param permissions * @param grantResults */ public static void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults, PermissionCallBack mCallBack) { if (requestCode ==REQUEST_EXTERNAL_STORAGE) { //判斷權限是否申請成功 if(grantResults.length > 0 && grantResults[0] ==PackageManager.PERMISSION_GRANTED) { mCallBack.setOnPermissionListener(true); } else { mCallBack.setOnPermissionListener(false); } return; } } /** * 6.0以下申請打開權限管理 * * @param mContext */ public static void openPre(final Context mContext) { RemindDialogUtil.showRemindDialog(mContext, "
主站蜘蛛池模板:
福州市|
青州市|
高碑店市|
衢州市|
咸阳市|
瓦房店市|
措美县|
桑植县|
中江县|
泉州市|
平谷区|
三穗县|
阿克陶县|
宿迁市|
蚌埠市|
兰西县|
镶黄旗|
河北区|
枣阳市|
张家港市|
舒城县|
岚皋县|
红安县|
阿坝|
阿鲁科尔沁旗|
万全县|
克山县|
方城县|
浪卡子县|
灵宝市|
会昌县|
建德市|
故城县|
永昌县|
韶关市|
肇东市|
枣阳市|
桃江县|
赤水市|
城步|
通榆县|