美文网首页
适配Android 6 动态权限管理

适配Android 6 动态权限管理

作者: 鹅鹅鹅_ | 来源:发表于2019-01-08 15:40 被阅读0次

最近适配Android 8,发现其实项目代码连6都没有做适配......

Android6.0以上的系统中,引入了运行时权限检查,运行时权限分为正常权限和危险权限,当我们的App调用了需要危险权限的api时,需要向系统申请权限,系统会弹出一个对话框让用户感知,只有当用户授权以后,App才能正常调用api。

6以上的系统中,我们在AndroidManifest.xml中声明的某些权限,系统默认不再授权了,即使安装时用户没有异议。我们需要在运行时动态的判断是否拥有权限,以及动态的申请权限。

好吧,Android越来越向iOS靠近了。

其实我们可以在应用启动的时候集中申请我们需要的所有相关权限,然后应用中使用到相应权限时判断一下,如果有权限则进行操作,否则进行其他操作。

这里写了一个权限管理工具类。注意,既然是适配,我们就需要判断版本Build.VERSION_CODES.M,系统版本低于6时不用动态申请权限,默认拥有权限。

package com.xiaoxiaoqiquan.client.util;

import android.Manifest;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;

import com.xiaoxiaoqiquan.base.BaseActivity;
import com.xiaoxiaoqiquan.client.IApplication;

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

public class PermissionUtil {
    @TargetApi(23)
    public static void getPersimmions(BaseActivity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            List<String> permissions = new ArrayList<>();

            addPermission(activity, permissions, Manifest.permission.WRITE_EXTERNAL_STORAGE);
            addPermission(activity, permissions, Manifest.permission.READ_PHONE_STATE);

            if (permissions.size() > 0) {
                activity.requestPermissions(permissions.toArray(new String[permissions.size()]), 1);
            }
        }
    }

    @TargetApi(23)
    private static boolean addPermission(BaseActivity activity, List<String> permissionsList, String permission) {
        if (activity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { // 如果应用没有获得对应权限,则添加到列表中,准备批量申请
            if (activity.shouldShowRequestPermissionRationale(permission)){
                return true;
            }else{
                permissionsList.add(permission);
                return false;
            }

        }else{
            return true;
        }
    }

    public static boolean checkPermission(String permission) {
        Context context = IApplication.getContext();
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M
                || context.getPackageManager().checkPermission(permission, context.getPackageName()) == PackageManager.PERMISSION_GRANTED) {
            return true;
        }

        return false;
    }
}

然后在应用靠前的Activity中进行权限申请,在我这里是用户登录页面

PermissionUtil.getPersimmions(this);

然后在需要权限进行操作的地方先进行权限判断,有相关权限再进行相关操作。这里是判断有没有sd卡并且有sd卡的写权限,如果有则记录日志到sd卡,否则记录日志到内部存储卡

if (TextUtils.equals(Environment.getExternalStorageState(), Environment.MEDIA_MOUNTED)
                    && PermissionUtil.checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {// 优先保存到SD卡中
                PATH_LOGCAT = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + APP_TAG + File.separator + (BuildConfig.DEBUG?"debug-":"") + "log";
 } else {// 如果SD卡不存在或者没有权限,就保存到本应用的目录下
                PATH_LOGCAT = context.getFilesDir().getAbsolutePath() + File.separator + APP_TAG + File.separator + (BuildConfig.DEBUG?"debug-":"") +
                "log";
}

相关文章

网友评论

      本文标题:适配Android 6 动态权限管理

      本文链接:https://www.haomeiwen.com/subject/ydxbrqtx.html