安卓6.0运行时权限申请参考

PermissionHelper
package com.mlibs.library.permission;

import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;

import com.mlibs.library.BuildConfig;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

/**
 * 推荐使用:
 * //6.0权限申请 混淆:-dontwarn com.hjq.permissions.**
 * implementation 'com.hjq:xxpermissions:6.2'
 * <p>
 * 本工具类有很多问题,仅供参考
 * 已知问题:
 * 1.已知不能在子线程运行
 * 2.要注意内存溢出问题
 *
 * @author mwq
 */
public class PermissionHelper extends Fragment {
    private static final String TAG = "PermissionHelper";

    private static List<String> mRegisteredInManifestPermissions;

    // key=request_code
    private static Map<Integer, OnPermissionGrantedListener> mOnGrantedListeners;
    private static Map<Integer, OnPermissionDeniedListener> mOnDeniedListeners;
    private static int mRequestCode = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    /**
     * @param permissions e.g. {@link Manifest.permission#CAMERA}
     * @return true:全部授予 false:有没授予的权限存在
     */
    public static boolean isGranted(Activity activity, String... permissions) {
        checkManifestPermissions(activity, permissions);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            for (String permission : permissions) {
                if (activity.checkSelfPermission(permission) == PackageManager.PERMISSION_DENIED) {
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * @param grantedListener 运行权限全部授予
     * @param deniedListener  运行权限没有全部授予
     */
    @TargetApi(Build.VERSION_CODES.M)
    public static void requestPermissions(Activity activity, OnPermissionGrantedListener grantedListener, OnPermissionDeniedListener deniedListener, String... permissions) {
        checkManifestPermissions(activity, permissions);

        if (isGranted(activity, permissions)) {
            if (grantedListener != null) grantedListener.onGranted();
            return;
        }

        Fragment fragment = activity.getFragmentManager().findFragmentByTag(TAG);
        if (fragment == null) {
            fragment = new PermissionHelper();
            final FragmentManager fragmentManager = activity.getFragmentManager();
            fragmentManager.beginTransaction().add(fragment, TAG).commitAllowingStateLoss();
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    fragmentManager.executePendingTransactions();
                }
            });

        }

        mOnGrantedListeners.put(mRequestCode, grantedListener);
        mOnDeniedListeners.put(mRequestCode, deniedListener);
        fragment.requestPermissions(permissions, mRequestCode++);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (mOnGrantedListeners.containsKey(requestCode)) {
            // 这里规定全部权限都通过才算通过
            boolean granted = true;
            // 在Activity A申请权限,然后马上跳转到Activity B,则grantResults.length=0
            if (grantResults.length == 0) granted = false;
            for (int result : grantResults) {
                if (result == PackageManager.PERMISSION_DENIED) {
                    granted = false;
                    break;
                }
            }
            if (granted) {
                OnPermissionGrantedListener listener = mOnGrantedListeners.get(requestCode);
                if (listener != null) listener.onGranted();
            } else {
                OnPermissionDeniedListener listener = mOnDeniedListeners.get(requestCode);
                if (listener != null) listener.onDenied();
            }
            mOnGrantedListeners.remove(mRequestCode);
            mOnDeniedListeners.remove(mRequestCode);
        }
        mOnGrantedListeners.clear();
        mOnGrantedListeners = null;
        mOnDeniedListeners.clear();
        mOnDeniedListeners = null;
        if (mRegisteredInManifestPermissions != null) mRegisteredInManifestPermissions.clear();
        mRegisteredInManifestPermissions = null;
    }

    /**
     * @param permission 单个权限
     * @return 是否缺少某项权限
     */
    public boolean hasPermission(Context context, String permission) {
//        ActivityCompat.checkSelfPermission()//检查
//        ActivityCompat.requestPermissions()//请求
        return ContextCompat.checkSelfPermission(context.getApplicationContext(), permission) == PackageManager.PERMISSION_DENIED;
    }

    /**
     * call before {@link #isGranted(Activity, String...)} and {@link #requestPermissions(Activity, OnPermissionGrantedListener, OnPermissionDeniedListener, String...)}
     */
    private static void checkManifestPermissions(Activity activity, String... permissions) {
        if (permissions == null || permissions.length == 0) {
            throw new IllegalArgumentException("至少出入一个权限");
        }

        if (mRegisteredInManifestPermissions == null) {
            mRegisteredInManifestPermissions = getRegisteredInManifestPermissions(activity);
        }

        if (mOnGrantedListeners == null) mOnGrantedListeners = new Hashtable<>();
        if (mOnDeniedListeners == null) mOnDeniedListeners = new Hashtable<>();

        for (String permission : permissions) {
            if (!mRegisteredInManifestPermissions.contains(permission)) {
                throw new IllegalArgumentException("这个权限:\"" + permission + "\" 没有在清单文件中注册!!!");
            }
        }
    }

    /**
     * @return 在清单文件中注册过的权限
     */
    private static List<String> getRegisteredInManifestPermissions(Activity activity) {
        List<String> list = new ArrayList<>();
        try {
            PackageInfo packageInfo = activity.getPackageManager().getPackageInfo(activity.getPackageName(), PackageManager.GET_PERMISSIONS);
            String[] permissions = packageInfo.requestedPermissions;
            if (permissions != null) {
                list.addAll(Arrays.asList(permissions));
            }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return list;
    }


    /**
     * 跳转到权限设置页面(不同手机可能跳转方式不同,使用时需要查下资料确定一下)
     */
    public static void startAppSettings(Context context) {
        if (Build.MANUFACTURER.equals("Xiaomi")) {
            Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
            ComponentName componentName = new ComponentName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
            intent.setComponent(componentName);
            intent.putExtra("extra_pkgname", BuildConfig.APPLICATION_ID);
            context.startActivity(intent);
//            ActivityCompat.startActivityForResult(activity, intent, , );
        } else if (Build.MANUFACTURER.equals("Meizu")) {
            Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
            context.startActivity(intent);
        } else {
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.setData(Uri.parse("package:" + context.getPackageName()));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
            intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
            context.startActivity(intent);
        }

    }


    @FunctionalInterface
    public interface OnPermissionDeniedListener {
        void onDenied();
    }

    @FunctionalInterface
    public interface OnPermissionGrantedListener {
        void onGranted();
    }

}

第二版

package com.audient.permissionhelper;

import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.util.Log;

import BuildConfig;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 推荐使用:
 * //6.0权限申请 混淆:-dontwarn com.hjq.permissions.**
 * implementation 'com.hjq:xxpermissions:6.2'
 * <p>
 * 本工具类有很多问题,仅供参考
 * 已知问题:
 * 1.已知不能在子线程运行
 * 2.要注意内存溢出问题
 *
 * @author mwq
 */
public class PermissionUtils extends Fragment {
    private static final String TAG = "PermissionFragment";

    private static List<String> mRegisteredInManifestPermissions;

    private static OnPermission mOnPermission;
    private static int mRequestCode = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    /**
     * @param permissions e.g. {@link Manifest.permission#CAMERA}
     * @return true:全部授予 false:有没授予的权限存在
     */
    public static boolean isGranted(Activity activity, String... permissions) {
        checkManifestPermissions(activity, permissions);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            for (String permission : permissions) {
                if (activity.checkSelfPermission(permission) == PackageManager.PERMISSION_DENIED) {
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * @param onPermission 运行权限
     */
    @TargetApi(Build.VERSION_CODES.M)
    public static void requestPermissions(Activity activity, OnPermission onPermission, String... permissions) {
        checkManifestPermissions(activity, permissions);
        mOnPermission = onPermission;
        if (isGranted(activity, permissions)) {
            if (onPermission != null)
                onPermission.onRequestResults(true, new ArrayList<>());
            return;
        }

        Fragment fragment = activity.getFragmentManager().findFragmentByTag(TAG);
        if (fragment == null) {
            fragment = new PermissionUtils();
            final FragmentManager fragmentManager = activity.getFragmentManager();
            fragmentManager.beginTransaction().add(fragment, TAG).commitAllowingStateLoss();
            fragmentManager.executePendingTransactions();

        }
        fragment.requestPermissions(permissions, mRequestCode);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == mRequestCode) {
            Log.i("调试信息", "requestCode = [" + requestCode + "], permissions = [" + Arrays.toString(permissions) + "], grantResults = [" + Arrays.toString(grantResults) + "]");
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            ArrayList<String> noGranteds = new ArrayList<>();
            // 这里规定全部权限都通过才算通过
            boolean granted = true;
            // 在Activity A申请权限,然后马上跳转到Activity B,则grantResults.length=0
            if (grantResults.length == 0) granted = false;
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                    granted = false;
                    noGranteds.add(permissions[i]);
                }
            }
            if (mOnPermission != null) {
                mOnPermission.onRequestResults(granted, noGranteds);
            }
        }
    }

    /**
     * @param permission 单个权限
     * @return 是否缺少某项权限
     */
    public boolean hasPermission(Context context, String permission) {
        return ContextCompat.checkSelfPermission(context.getApplicationContext(), permission) == PackageManager.PERMISSION_DENIED;
    }

    /**
     * call before {@link #isGranted(Activity, String...)} and {@link #requestPermissions(Activity, OnPermission, String...)}
     */
    private static void checkManifestPermissions(Activity activity, String... permissions) {
        if (permissions == null || permissions.length == 0) {
            throw new IllegalArgumentException("至少输入一个权限");
        }

        if (mRegisteredInManifestPermissions == null) {
            mRegisteredInManifestPermissions = getRegisteredInManifestPermissions(activity);
        }


        for (String permission : permissions) {
            if (!mRegisteredInManifestPermissions.contains(permission)) {
                throw new IllegalArgumentException("这个权限:\"" + permission + "\" 没有在清单文件中注册!!!");
            }
        }
    }

    /**
     * @return 在清单文件中注册过的权限
     */
    private static List<String> getRegisteredInManifestPermissions(Activity activity) {
        List<String> list = new ArrayList<>();
        try {
            PackageInfo packageInfo = activity.getPackageManager().getPackageInfo(activity.getPackageName(), PackageManager.GET_PERMISSIONS);
            String[] permissions = packageInfo.requestedPermissions;
            if (permissions != null) {
                list.addAll(Arrays.asList(permissions));
            }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return list;
    }


    /**
     * 跳转到权限设置页面(不同手机可能跳转方式不同,使用时需要查下资料确定一下)
     */
    public static void startAppSettings(Context context) {
        if (Build.MANUFACTURER.equals("Xiaomi")) {
            Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
            ComponentName componentName = new ComponentName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
            intent.setComponent(componentName);
            intent.putExtra("extra_pkgname", BuildConfig.APPLICATION_ID);
            context.startActivity(intent);
//            ActivityCompat.startActivityForResult(activity, intent, , );
        } else if (Build.MANUFACTURER.equals("Meizu")) {
            Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
            context.startActivity(intent);
        } else {
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.setData(Uri.parse("package:" + context.getPackageName()));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
            intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
            context.startActivity(intent);
        }

    }

    @FunctionalInterface
    public interface OnPermission {

        /**
         * @param isAll      是否全部通过
         * @param noGranteds 未通过的权限数据
         */
        void onRequestResults(boolean isAll, List<String> noGranteds);
    }

}

参考链接:http://www.demodashi.com/demo/13506.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值