Android 6.0动态申请权限
2017-10-23 19:47
369 查看
Android 6.0动态申请权限
在android 6.0以下,开发者只需要在配置清单中说明,用户安装APP同意APP所申请的所有权限才能进行安装,而在android 6.0以上,开发者不仅要在配置清单中说明,对于一些危险权限还需要代码动态申请。这些危险权限在用户授权后才可以使用,比如调用摄像头、读取通讯录、定位等。1. 需要动态申请的权限
以下为需要动态申请的权限,共有9组,每一组只有任何一个权限申请成功了,就默认整组的权限都可以使用。group:android.permission-group.CONTACTS //通讯录
permission:android.permission.WRITE_CONTACTS //写入通讯录
permission:android.permission.GET_ACCOUNTS //访问GMail账户列表
permission:android.permission.READ_CONTACTS //读取通讯录
group:android.permission-group.PHONE //手机
permission:android.permission.READ_CALL_LOG //读取通话记录
permission:android.permission.READ_PHONE_STATE //读取电话状态
permission:android.permission.CALL_PHONE //拨打电话
permission:android.permission.WRITE_CALL_LOG //写入通话记录
permission:android.permission.USE_SIP //允许程序使用SIP视频服务
permission:android.permission.PROCESS_OUTGOING_CALLS //允许程序监视,修改或放弃播出电话
permission:com.android.voicemail.permission.ADD_VOICEMAIL//允许应用程序添加系统中的语音邮件。
group:android.permission-group.CALENDAR //系统日历
permission:android.permission.READ_CALENDAR //读取用户的日程信息
permission:android.permission.WRITE_CALENDAR //写入用户的日程信息
group:android.permission-group.CAMERA //摄像头
permission:android.permission.CAMERA //允许调用摄像头
group:android.permission-group.SENSORS //手机传感器
permission:android.permission.BODY_SENSORS//允许获取传感器数据
group:android.permission-group.LOCATION //定位权限
permission:android.permission.ACCESS_FINE_LOCATION //获取精准定位,通过GPS芯片
permission:android.permission.ACCESS_COARSE_LOCATION//通过wifi或基站获取粗略定位
group:android.permission-group.STORAGE //存储权限
permission:android.permission.READ_EXTERNAL_STORAGE //允许读取外部存储
permission:android.permission.WRITE_EXTERNAL_STORAGE //允许写入外部存储
group:android.permission-group.MICROPHONE //录音权限
permission:android.permission.RECORD_AUDIO //允许通过麦克风来录音
group:android.permission-group.SMS //短信权限
permission:android.permission.READ_SMS //允许读取短信
permission:android.permission.RECEIVE_WAP_PUSH//允许接收WAP PUSH信息
permission:android.permission.RECEIVE_MMS //允许接收彩信
permission:android.permission.RECEIVE_SMS //允许接收短信
permission:android.permission.SEND_SMS//允许发送短信
permission:android.permission.READ_CELL_BROADCASTS //获取小区广播
2. 危险权限申请步骤
2.1 在配置清单中添加所需要申请的权限
如 在配置清单中添加: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2.2 申请权限步骤
2.2.1 检查权限
if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { //没有授权 }else{ //已经授权过了 }
或者通过以下方式检查是否授权了
if (PackageManager.PERMISSION_GRANTED!=ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { //没有授权 }else{ //已经授权过了 }
2.2.2 请求权限申请
通过ActivityCompat.requestPermissions(final @NonNull Activity activity, final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode) 方法申请权限,通过第二个参数可以看出一次可以申请多个权限。2.2.3 申请权限回调
在Activity中重写如下函数/** * * @param requestCode 请求码 * @param permissions 请求的权限数组 * @param grantResults 请求每个权限的状态:允许还是拒绝。对应于每个权限 */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == WRITE_PERMISSION_REQ_CODE){ for (int i = 0; i < grantResults.length; i++) { if (grantResults[i] != PackageManager.PERMISSION_GRANTED){ //如果拒绝了 //改方法主要用于给用户一个申请权限的解释,该方法只有在用户在上一次已经拒绝过 //你的权限申请。 boolean isTip =ActivityCompat.shouldShowRequestPermissionRationale(this,permissions[i]); if (isTip){ //表明用户没有彻底禁止弹出请求权限 }else { //表面用户彻底禁止了弹出请求权限,可以提示用户然后跳到设置中打开权限 } }else{ //允许了 } } } }
2.3 权限申请的封装
import android.Manifest; import android.app.Activity; import android.content.pm.PackageManager; import android.os.Build; import android.support.v4.app.ActivityCompat; import android.support.v4.content.PermissionChecker; import java.util.ArrayList; import java.util.List; /** * * @Description:权限检测 * @author: liuxin * @date: 2017/10/26 */ public class PermissionUtils { public static final String TAG = PermissionUtils.class.getSimpleName(); public static final int WRITE_PERMISSION_REQ_CODE = 100; /** * SD卡读写权限 * @param context * @return */ public static boolean checkWriteSDPermission(Activity context){ if (Build.VERSION.SDK_INT >= 23) { try { List<String> permissions = new ArrayList<>(); if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (permissions.size() != 0) { ActivityCompat.requestPermissions(context, (String[]) permissions.toArray(new String[permissions.size()]), WRITE_PERMISSION_REQ_CODE); return false; } } catch (Exception e) { e.printStackTrace(); return false; } } return true; } /** * 视频录制权限申请 * @param context * @return */ public static boolean checkVideoRecordPermission(Activity context){ if (Build.VERSION.SDK_INT >= 23) { try { List<String> permissions = new ArrayList<>(); if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.CAMERA)) { permissions.add(Manifest.permission.CAMERA); } if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.RECORD_AUDIO)) { permissions.add(Manifest.permission.RECORD_AUDIO); } if (permissions.size() != 0) { ActivityCompat.requestPermissions(context, (String[]) permissions.toArray(new String[permissions.size()]), WRITE_PERMISSION_REQ_CODE); return false; } } catch (Exception e) { e.printStackTrace(); return false; } } return true; } /** * 视频相机权限申请 * @param context * @return */ public static boolean checkCameraPermission(Activity context){ if (Build.VERSION.SDK_INT >= 23) { try { List<String> permissions = new ArrayList<>(); if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.CAMERA)) { permissions.add(Manifest.permission.CAMERA); } if (permissions.size() != 0) { ActivityCompat.requestPermissions(context, (String[]) permissions.toArray(new String[permissions.size()]), WRITE_PERMISSION_REQ_CODE); return false; } } catch (Exception e) { e.printStackTrace(); return false; } } return true; } /** * 音频录制权限申请 * @param context * @return */ public static boolean checkVoiceRecordPermission(Activity context){ if (Build.VERSION.SDK_INT >= 23) { try { List<String> permissions = new ArrayList<>(); if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.RECORD_AUDIO)) { permissions.add(Manifest.permission.RECORD_AUDIO); } if (permissions.size() != 0) { ActivityCompat.requestPermissions(context, (String[]) permissions.toArray(new String[permissions.size()]), WRITE_PERMISSION_REQ_CODE); return false; } } catch (Exception e) { e.printStackTrace(); return false; } } return true; } /** * 定位权限获取 * @param context * @return */ public static boolean checkLocationPermission(Activity context){ if (Build.VERSION.SDK_INT >= 23) { try { List<String> permissions = new ArrayList<>(); if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)) { permissions.add(Manifest.permission.ACCESS_FINE_LOCATION); } if (permissions.size() != 0) { ActivityCompat.requestPermissions(context, (String[]) permissions.toArray(new String[permissions.size()]), WRITE_PERMISSION_REQ_CODE); return false; } } catch (Exception e) { e.printStackTrace(); return false; } } return true; } /** * 手机状态相关 * @param context * @return */ public static boolean checkPhoneStatePermission(Activity context){ if (Build.VERSION.SDK_INT >= 23) { try { List<String> permissions = new ArrayList<>(); if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.READ_PHONE_STATE)) { permissions.add(Manifest.permission.READ_PHONE_STATE); } if (permissions.size() != 0) { ActivityCompat.requestPermissions(context, (String[]) permissions.toArray(new String[permissions.size()]), WRITE_PERMISSION_REQ_CODE); return false; } } catch (Exception e) { e.printStackTrace(); return false; } } return true; } /** * 获取手机短信 * * @param context * @return */ public static boolean checkPhoneMessagePermission(Activity context) { if (Build.VERSION.SDK_INT >= 23) { try { List<String> permissions = new ArrayList<>(); if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.READ_SMS)) { permissions.add(Manifest.permission.READ_SMS); } if (permissions.size() != 0) { ActivityCompat.requestPermissions(context, (String[]) permissions.toArray(new String[permissions.size()]), WRITE_PERMISSION_REQ_CODE); return false; } } catch (Exception e) { e.printStackTrace(); return false; } } return true; } /** * 获取手机通讯录 * * @param context * @return */ public static boolean checkPhoneContactsPermission(Activity context) { if (Build.VERSION.SDK_INT >= 23) { try { List<String> permissions = new ArrayList<>(); if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.READ_CONTACTS)) { permissions.add(Manifest.permission.READ_CONTACTS); } if (permissions.size() != 0) { ActivityCompat.requestPermissions(context, (String[]) permissions.toArray(new String[permissions.size()]), WRITE_PERMISSION_REQ_CODE); return false; } } catch (Exception e) { e.printStackTrace(); return false; } } return true; } }
通过在Activity中调用该类的某个静态方法来请求检测权限。如有需要可以重写 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) ;方法来提示用户。
相关文章推荐
- android简单学习6.0的动态权限申请
- Android 6.0 动态权限申请
- android 6.0动态申请权限
- Android 6.0 动态权限申请
- Android 6.0权限动态申请
- Android 6.0 动态权限申请
- Android 6.0 动态申请权限
- Android 6.0 动态权限申请
- Android 6.0动态权限申请--事例代码
- 一行代码搞定Android 6.0动态权限申请
- Android 6.0动态权限申请
- Android 6.0权限动态申请
- Android 6.0动态申请权限
- android 6.0 以上如何动态申请权限?
- android 6.0, 7.0之动态申请权限完美解决方案
- Android 6.0动态权限申请
- Android 6.0动态权限申请
- android 6.0 动态申请权限后 相机的使用核心方法
- android 6.0动态弹框申请权限实现
- Android 6.0 动态申请权限