Android 6.0动态申请权限
来源:互联网 发布:c语言不等于号怎么打 编辑:程序博客网 时间:2024/06/06 01:39
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动态申请权限
- Android 6.0 动态权限申请
- Android 6.0动态申请权限
- Android 6.0 动态权限申请
- 存储类-static extern
- 制作ZedBoard-linaro-desktop-ubuntu全过程之编译BOOT.bin
- 04Python中的控制流语句
- luogu P1341 无序字母对
- 10.23(周一)
- Android 6.0动态申请权限
- JDBC纯驱动连接MySQL
- BZOJ 1296 [SCOI2009]粉刷匠
- 初识java多线程
- C#+AE加载shape图层
- JDK7中Executors源码概述
- 点菜系统e-r图
- STL学习之string类
- 05Python中的number数据类型