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; }}
阅读全文
1 0
- Android移动开发-Android 6.0以上动态运行时权限申请方法
- android 6.0及以上 运行时权限申请(动态权限申请)
- Android 6.0以上 动态权限申请
- android 6.0以上动态权限的申请
- android 6.0 以上如何动态申请权限?
- Android M 6.0以上 需要运行时申请的权限
- Android 6.0以上 需要运行时申请的权限(一)
- Android 6.0以上 需要运行时申请的权限(二)
- Android 6.0(API 23)及其以上动态申请的权限与申请权限的方法
- android拨打电话崩溃6.0以上实时动态权限申请
- Android M 6.0以上 需要运行时申请的权限--easypermissions库
- android 6.0以上版本 运行时权限
- android studio 6.0以上运行时权限
- Android开发之运行时权限申请和自定义权限
- Android 6.0运行时申请权限
- 【Android】6.0 运行时权限申请
- Android 6.0 运行时权限申请
- android 6.0 运行时权限申请流程
- MarkHibernate
- 隐藏多余的字用 “省略号” 代替
- 664. Strange Printer
- ArrayList,LinkedList,Vestor区别及其优缺点
- FTPrep, 74 Search a 2D Matrix
- Android移动开发-Android 6.0以上动态运行时权限申请方法
- Win10 下python3.5.2安装科学计算库Scipy
- 221. Maximal Square
- mysql中Tinyint(1)数据格式自动转为boolean类型
- HDU 5934 Bomb (tarjan缩点)
- 写在前面
- js模块化的方法
- 《C++ Concurrency In Action》part4 同步并发操作(上)
- 踩内存问题定位总结