Android6.0动态权限的封装

推荐阅读:

Android-6.0动态权限

注意事项:

manifest清单文件中也需要写上需要动态授权的权限,否则动态申请不了。

如下:

ActivityCompat.requestPermissions(activity, permission, requestCode);
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>

示例:

PermissionUtils:封装类


/**
 * Created by Administrator on 2017/7/23.
 */

public class PermissionUtils {

    private static final String TAG = PermissionUtils.class.getSimpleName();

    private static PermissionGrant mPermissionGrant;

    interface PermissionGrant {
        void onPermissionGranted(int requestCode);

        void onPermissionFailure(int requestCode);
    }

    /**
     * 授权结果的处理
     */
    public static void requestPermissionsResult(Activity activity,
                                                int requestCode,
                                                @NonNull String[] permissions,
                                                @NonNull int[] grantResults,
                                                PermissionGrant permissionGrant) {

        if (activity == null) {
            Log.e(TAG, "activity == null");
            return;
        }

        if (grantResults.length == 0) {//无授权
            Log.e(TAG, "grantResults.length == 0");
            return;
        }

        if (grantResults.length == 1) {//单个权限
            Log.e(TAG, "grantResults.length == 1");
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                permissionGrant.onPermissionGranted(requestCode);
            } else {
                permissionGrant.onPermissionFailure(requestCode);
            }
        } else {//多个权限
            Log.e(TAG, "grantResults.length ==" + grantResults.length);
            //未授权集合
            List<String> notGranted = new ArrayList<>();

            //检查是否授权成功
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                    notGranted.add(permissions[i]);
                    Log.e(TAG, "notGranted ==" + permissions[i]);
                }
            }

            if (notGranted.size() == 0) {
                permissionGrant.onPermissionGranted(requestCode);
            } else {
                permissionGrant.onPermissionFailure(requestCode);
            }

            notGranted.clear();
            notGranted = null;
        }
    }

    public static final int REQUESTCODE_MULTI = 1;
    public static final int REQUESTCODE_SINGLE = 2;

    public static final String[] PERMISSION_RECORD_AUDIO = {Manifest.permission.RECORD_AUDIO};
    public static final String[] PERMISSION_GET_ACCOUNTS = {Manifest.permission.GET_ACCOUNTS};
    public static final String[] PERMISSION_READ_PHONE_STATE = {Manifest.permission.READ_PHONE_STATE};
    public static final String[] PERMISSION_CALL_PHONE = {Manifest.permission.CALL_PHONE};
    public static final String[] PERMISSION_CAMERA = {Manifest.permission.CAMERA};
    public static final String[] PERMISSION_ACCESS_FINE_LOCATION = {Manifest.permission.ACCESS_FINE_LOCATION};
    public static final String[] PERMISSION_ACCESS_COARSE_LOCATION = {Manifest.permission.ACCESS_COARSE_LOCATION};
    public static final String[] PERMISSION_READ_EXTERNAL_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE};
    public static final String[] PERMISSION_WRITE_EXTERNAL_STORAGE = {Manifest.permission.WRITE_EXTERNAL_STORAGE};

    public static final String[] requestPermissions = {
            Manifest.permission.CALL_PHONE,
            Manifest.permission.CAMERA,
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.SEND_SMS,
            Manifest.permission.READ_EXTERNAL_STORAGE
    };

    /**
     * 设置权限
     *
     * @param activity
     * @param permissions
     * @param requestCode
     * @return 授权前是否已有权限
     */
    public static boolean setPermission(Activity activity, String[] permissions, int requestCode) {

        if (Build.VERSION.SDK_INT < 23) {
            Log.e(TAG, "Build.VERSION.SDK_INT < 23");
            return true;
        }

        if (checkPermissions(activity, permissions)) {
            Log.e(TAG, "已有权限");
            return true;
        }

        Log.e(TAG, "弹窗:是否同意授权");
        requestPermission(activity, permissions, requestCode);
        return false;
    }


    /**
     * 提示单个权限的授权
     *
     * @param activity
     * @param permissions
     * @return
     */
    public static void showRequest(Activity activity, String[] permissions) {
        if (shouldShowRequest(activity, permissions)) {
            Log.e(TAG, "弹窗:已拒绝过再次温馨提示");
            PermissionUtils.showMessage(activity);
        }
    }


    /**
     * 是否提示单个权限
     *
     * @param activity
     * @param permissions
     * @return
     */
    public static boolean shouldShowRequest(Activity activity, String[] permissions) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permissions[0])) {
            return true;
        }
        return false;
    }


    /**
     * 检测权限是否都授权
     *
     * @param activity
     * @param permissions
     * @return
     */
    public static boolean checkPermissions(Activity activity, String[] permissions) {
        boolean hasAllPermission = true;

        if (permissions.length > 1) {

            List<String> unPermissions = new ArrayList<>();

            for (int i = 0; i < permissions.length; i++) {
                if (ActivityCompat.checkSelfPermission(activity, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
                    unPermissions.add(permissions[i]);
                }
            }

            if (unPermissions.size() > 0) {
                unPermissions.clear();
                unPermissions = null;

                hasAllPermission = false;
            }

        } else if (permissions.length == 1) {
            if (ActivityCompat.checkSelfPermission(activity, permissions[0]) != PackageManager.PERMISSION_GRANTED) {
                hasAllPermission = false;
            }
        }


        return hasAllPermission;
    }


    /**
     * 请求权限
     *
     * @param activity
     * @param permission
     * @param requestCode
     */
    public static void requestPermission(Activity activity, String[] permission, int requestCode) {
        ActivityCompat.requestPermissions(activity, permission, requestCode);
    }


    /**
     * 提示开启权限
     *
     * @param activity
     */
    public static void showMessage(final Activity activity) {
        new AlertDialog.Builder(activity)
                .setMessage("app需要开启权限才能使用此功能")
                .setPositiveButton("设置", new DialogInterface.OnClickListener() {
                    //打开手机setting授权的页面
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Intent intent = new Intent();
                        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
                        intent.setData(uri);
                        activity.startActivity(intent);
                    }
                })
                .setNegativeButton("取消", null)
                .create()
                .show();
    }


}

布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onclick2"
        android:text="启动界面多个权限" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onclick1"
        android:text="打电话一个权限" />


</LinearLayout>

StartActivity:调用

public class StartActivity extends AppCompatActivity {

    private Intent intent;
    private Uri data;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);

        intent = new Intent(Intent.ACTION_CALL);
        data = Uri.parse("tel:" + "10010");
        intent.setData(data);
    }

    /**
     * 打电话按钮:单个权限
     *
     * @param view
     */
    public void onclick1(View view) {
        boolean alreadyHasPermission = PermissionUtils.setPermission(this,
                PermissionUtils.PERMISSION_CALL_PHONE,
                PermissionUtils.REQUESTCODE_SINGLE);

        if (alreadyHasPermission) {
            startActivity(intent);
        }
    }


    /**
     * 闪屏页界面:只一次,直接申请多个权限:打电话 + 写入权限
     *
     * @param v
     */
    public void onclick2(View v) {
        boolean alreadyHasPermission = PermissionUtils.setPermission(this,
                PermissionUtils.requestPermissions,
                PermissionUtils.REQUESTCODE_MULTI);

        if (alreadyHasPermission) {
            startActivity(intent);
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        PermissionUtils.requestPermissionsResult(this, requestCode, permissions, grantResults,
                new PermissionUtils.PermissionGrant() {
                    @Override
                    public void onPermissionGranted(int requestCode) {
                        Log.e("PermissionUtils", "授权回调结果111:成功");
                        startActivity(intent);
                    }

                    @Override
                    public void onPermissionFailure(int requestCode) {
                        Log.e("PermissionUtils", "授权回调结果111:失败");
                        if (requestCode == PermissionUtils.REQUESTCODE_SINGLE) {
                            PermissionUtils.showRequest(StartActivity.this, PermissionUtils.PERMISSION_CALL_PHONE);
                        }
                    }
                });
    }


}

参考:

Android6.0动态权限申请步骤以及需要注意的一些坑

在Android 6.0 设备上动态获取权限

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值