Android6.0动态权限

2019-03-08  本文已影响0人  MengkZhang

Android 6.0收紧了权限的控制,如果应用的targetSdkVersion>=23,那不仅仅要在清单文件中声明需要用到的权限,还需要在用户使用时让用户能同意部分权限。app权限被分为几个等级,具体的自己搜索了解下哈,这里重点在需要动态申请的权限。这些权限中被分了组,即:一旦组内某个权限被允许,该组的其他权限也是被允许的。

当然,避开这些是没问题的,将targetSdkVersion设在23以下就行了,即使在Android 6.0的手机上也是按照之前的方式处理权限:同意安装即视为同意所有权限。所以能短时间避开这种问题。

目前对于动态权限的解决方案主要是基于RxPermission的

而RxPermission基于RxJava1或者RxJava2

一:基于RxJava2实现的动态权限

1.1配置

在app的build.gradle

    //Android6.0动态权限内库 https://github.com/tbruyelle/RxPermissions
    implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
    //RxJava
    implementation "io.reactivex.rxjava2:rxjava:2.2.3"

在项目下的build.gradle

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://jitpack.io' }
    }
}

1.2动态权限工具类

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AlertDialog;

import com.tbruyelle.rxpermissions2.RxPermissions;

/**
 * Created by Mengk on 2019/3/8
 * Describe :  动态权限帮助类
 */
public class PermissionUtil {
    /**
     * 初始化Android6.0动态权限
     * @param context
     * @param tips
     * @param listener
     * @param permissions
     */
    @SuppressLint("CheckResult")
    public static void initPermission(FragmentActivity context, final String tips, final OnInitRxPermissionListener listener, String... permissions) {
        RxPermissions rxPermissions = new RxPermissions(context);
        rxPermissions
                .request(
                        permissions
                )
                .subscribe(granted -> {
                    if (granted) { // Always true pre-M
                        listener.onSuccess();
                    } else {
                        // Oups permission denied
                        final AlertDialog.Builder builder = new AlertDialog.Builder(context);
                        builder.setTitle("提示");
                        builder.setMessage(tips);
                        builder.setCancelable(false);
                        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int which) {
                                dialogInterface.cancel();
                                dialogInterface.dismiss();
                                listener.onCancel();
                                Intent settingIntent = getAppDetailSettingIntent(context);
                                context.startActivity(settingIntent);
                            }
                        });
                        builder.create().show();
                    }
                });
    }


    /**
     * 调起系统设置界面
     *
     * @param context
     * @return
     */
    private static Intent getAppDetailSettingIntent(Activity context) {
        try {
            Intent localIntent = new Intent();
            localIntent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            Uri uri = Uri.fromParts("package", AppUtils.getPackageName(context), null);
            localIntent.setData(uri);
            localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            return localIntent;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    public interface OnInitRxPermissionListener {
        void onSuccess();

        void onCancel();
    }
}

1.3 在onCreate()中调用

        PermissionUtil.initPermission(this, "没有获得相关权限", new PermissionUtil.OnInitRxPermissionListener() {
                    @Override
                    public void onSuccess() {
                        Toast.makeText(SplashActivity.this, "允许了", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onCancel() {

                    }
                },
                Manifest.permission.CAMERA,
                Manifest.permission.CALL_PHONE);

1.4清单文件静态权限配置

    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.CALL_PHONE" />

至此over

二:基于RxJava1实现的动态权限

1.1配置

在app的build.gradle下

    implementation 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'

1.2动态权限工具类

public class PermissionUtil {
    /**
     * 动态权限方法
     *
     * @param context
     * @param tips
     * @param listener
     * @param permissions
     */
    public static void initRxPermission(final Activity context, final String tips, final OnInitRxPermissionListener listener, String... permissions) {
        RxPermissions rxPermissions = new RxPermissions(context);
        rxPermissions.request(permissions)
                .subscribe(new Action1<Boolean>() {
                    @Override
                    public void call(Boolean granted) {
                        if (granted) {
                            listener.onSuccess();
                        } else {
                            //不同意 给提示
                            final AlertDialog.Builder builder = new AlertDialog.Builder(context);
                            builder.setTitle("提示");
                            builder.setMessage(tips);
                            builder.setCancelable(false);
                            builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int which) {
                                    dialogInterface.cancel();
                                    dialogInterface.dismiss();
                                    listener.onCancel();
                                    Intent settingIntent = getAppDetailSettingIntent(context);
                                    context.startActivity(settingIntent);
                                }
                            });
                            builder.create().show();
                        }
                    }
                });
    }

    /**
     * 调起系统设置界面
     *
     * @param context
     * @return
     */
    private static Intent getAppDetailSettingIntent(Activity context) {
        try {
            Intent localIntent = new Intent();
            localIntent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            Uri uri = Uri.fromParts("package", AppUtils.getPackageName(context), null);
            localIntent.setData(uri);
            localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            return localIntent;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public interface OnInitRxPermissionListener {
        void onSuccess();

        void onCancel();
    }


}

1.3 在onCreate()中调用

      PermissionUtil.initRxPermission(this, "没有获得相关的权限!,请在“权限管理中打开”", new PermissionUtil.OnInitRxPermissionListener() {
                        @Override
                        public void onSuccess() {
                            callContactUI();
                        }

                        @Override
                        public void onCancel() {
                            ToastUtils.showToast(ContactsNumActivity.this, "权限已经被拒绝!!", Toast.LENGTH_SHORT);
                        }
                    },
                    android.Manifest.permission.READ_CONTACTS,
                    android.Manifest.permission.WRITE_CONTACTS
            );

1.4清单文件静态权限配置

    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
上一篇 下一篇

猜你喜欢

热点阅读