Android移动开发-Android 6.0以上动态运行时权限申请方法

来源:互联网 发布:华美淘宝客优惠券采集 编辑:程序博客网 时间:2024/06/07 06:08

自从Android6.0版本开始就添加了动态运行时权限,比如获取地理位置、访问手机内存卡、日历以及调用相机等等。 以下是Android 6.0以上动态运行时权限的申请方法。

  • 方法一:比如基于定位的动态申请权限方法
    /**     * Android 6.0 以上的版本的定位方法     */    public void showContacts() {        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)                != PackageManager.PERMISSION_GRANTED                || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)                != PackageManager.PERMISSION_GRANTED                || ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)                != PackageManager.PERMISSION_GRANTED) {            Toast.makeText(getApplicationContext(), "没有权限,请手动开启定位权限", Toast.LENGTH_SHORT).show();            // 申请一个(或多个)权限,并提供用于回调返回的获取码(用户定义)            ActivityCompat.requestPermissions(MainActivity.this, new String[]{                    Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE            }, BAIDU_READ_PHONE_STATE);        } else {        // 执行定位            initLocation();        }    }    // Android 6.0 以上的版本申请权限的回调方法    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            // requestCode即所声明的权限获取码,在checkSelfPermission时传入            case BAIDU_READ_PHONE_STATE:                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    // 获取到权限,作相应处理(调用定位SDK应当确保相关权限均被授权,否则可能引起定位失败)                    initLocation();                } else {                    // 没有获取到权限,做特殊处理                    Toast.makeText(getApplicationContext(), "获取位置权限失败,请手动开启", Toast.LENGTH_SHORT).show();                }                break;            default:                break;        }    }
  • 方法二:定义Utils/XPermissionUtils.java工具类逻辑代码
package com.fukaimei.filetest.Utils;import android.annotation.TargetApi;import android.app.Activity;import android.content.Context;import android.content.pm.PackageManager;import android.os.Build;import android.support.annotation.NonNull;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import java.util.ArrayList;import java.util.List;/** * Created by FuKaimei on 2017/9/18. */public class XPermissionUtils {    private static int mRequestCode = -1;    private static OnPermissionListener mOnPermissionListener;    public interface OnPermissionListener {        void onPermissionGranted();        void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied);    }    @TargetApi(Build.VERSION_CODES.M)    public static void requestPermissionsAgain(@NonNull Context context, @NonNull String[] permissions,                                               @NonNull int requestCode) {        if (context instanceof Activity) {            ((Activity) context).requestPermissions(permissions, requestCode);        } else {            throw new IllegalArgumentException("Context must be an Activity");        }    }    @TargetApi(Build.VERSION_CODES.M)    public static void requestPermissions(@NonNull Context context, @NonNull int requestCode,                                          @NonNull String[] permissions, OnPermissionListener listener) {        mRequestCode = requestCode;        mOnPermissionListener = listener;        String[] deniedPermissions = getDeniedPermissions(context, permissions);        if (deniedPermissions.length > 0) {            requestPermissionsAgain(context, permissions, requestCode);        } else {            if (mOnPermissionListener != null) mOnPermissionListener.onPermissionGranted();        }    }    /**     * 请求权限结果,对应Activity中onRequestPermissionsResult()方法。     */    public static void onRequestPermissionsResult(@NonNull Activity context, int requestCode,                                                  @NonNull String[] permissions, int[] grantResults) {        if (mRequestCode != -1 && requestCode == mRequestCode) {            if (mOnPermissionListener != null) {                String[] deniedPermissions = getDeniedPermissions(context, permissions);                if (deniedPermissions.length > 0) {                    boolean alwaysDenied = hasAlwaysDeniedPermission(context, permissions);                    mOnPermissionListener.onPermissionDenied(deniedPermissions, alwaysDenied);                } else {                    mOnPermissionListener.onPermissionGranted();                }            }        }    }    /**     * 获取请求权限中需要授权的权限     */    private static String[] getDeniedPermissions(@NonNull Context context, @NonNull String[] permissions) {        List<String> deniedPermissions = new ArrayList();        for (String permission : permissions) {            if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED) {                deniedPermissions.add(permission);            }        }        return deniedPermissions.toArray(new String[deniedPermissions.size()]);    }    /**     * 是否彻底拒绝了某项权限     */    private static boolean hasAlwaysDeniedPermission(@NonNull Context context, @NonNull String... deniedPermissions) {        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return false;        boolean rationale;        for (String permission : deniedPermissions) {            rationale = ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, permission);            if (!rationale) return true;        }        return false;    }}
原创粉丝点击