安卓M 6.0动态权限的问题
来源:互联网 发布:站长工具源码 编辑:程序博客网 时间:2024/06/10 01:58
项目开发中,相信有同志碰见,往SD卡中写数据总是失败的问题,导致升级失败等问题。安卓6.0之前只需要在清单文件中配置需要的权限即可,当用户在安装app的时候,会列出一大列的权限,甚至包括许多涉及隐私的权限,用户没注意就进行了安装,往往对用户造成损失。为此,google在安卓6.0之后,退出了动态权限的机制,即不仅需要在清单文件中进行配置,对于一些危险的权限还需要再以弹框的形式,询问用户是否开启权限。
注意:在编译项目工程的时候,如果 targetSdkVersion<23 可以不用动态申请权限。
如果大于23的targetSdkVersion就需要动态申请权限了;
背景说完了,下面看看怎么去实现:
1:由于权限API的问题,我们的Actiivty最好是AppCompatActivity类型的,也就是说在你的BaseActivity需要继承AppCompatActivity
具体的权限分组情况如下表:
1 危险权限(需要手动申请)
android.permission-group.CALENDAR
android.permission.READ_CALENDAR
android.permission.WRITE_CALENDAR
android.permission-group.CAMERA
android.permission.CAMERA
android.permission-group.CONTACTS
android.permission.READ_CONTACTS
android.permission.WRITE_CONTACTS
android.permission.GET_ACCOUNTS
android.permission-group.LOCATION
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
android.permission-group.MICROPHONE
android.permission.RECORD_AUDIO
android.permission-group.PHONE
android.permission.READ_PHONE_STATE
android.permission.CALL_PHONE
android.permission.READ_CALL_LOG
android.permission.WRITE_CALL_LOG
com.android.voicemail.permission.ADD_VOICEMAIL
android.permission.USE_SIP
android.permission.PROCESS_OUTGOING_CALLS
android.permission-group.SENSORS
android.permission.BODY_SENSORS
android.permission-group.SMS
android.permission.SEND_SMS
android.permission.RECEIVE_SMS
android.permission.READ_SMS
android.permission.RECEIVE_WAP_PUSH
android.permission.RECEIVE_MMS
android.permission.READ_CELL_BROADCASTS
android.permission-group.STORAGE
android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE
2、一般权限(只需在Manifest文件中声明即可)
android.permission.ACCESS_LOCATION_EXTRA_COMMANDSandroid.permission.ACCESS_NETWORK_STATEandroid.permission.ACCESS_NOTIFICATION_POLICYandroid.permission.ACCESS_WIFI_STATEandroid.permission.ACCESS_WIMAX_STATEandroid.permission.BLUETOOTHandroid.permission.BLUETOOTH_ADMINandroid.permission.BROADCAST_STICKYandroid.permission.CHANGE_NETWORK_STATEandroid.permission.CHANGE_WIFI_MULTICAST_STATEandroid.permission.CHANGE_WIFI_STATEandroid.permission.CHANGE_WIMAX_STATEandroid.permission.DISABLE_KEYGUARDandroid.permission.EXPAND_STATUS_BARandroid.permission.FLASHLIGHTandroid.permission.GET_ACCOUNTSandroid.permission.GET_PACKAGE_SIZEandroid.permission.INTERNETandroid.permission.KILL_BACKGROUND_PROCESSESandroid.permission.MODIFY_AUDIO_SETTINGSandroid.permission.NFCandroid.permission.READ_SYNC_SETTINGSandroid.permission.READ_SYNC_STATSandroid.permission.RECEIVE_BOOT_COMPLETEDandroid.permission.REORDER_TASKSandroid.permission.REQUEST_INSTALL_PACKAGESandroid.permission.SET_TIME_ZONEandroid.permission.SET_WALLPAPERandroid.permission.SET_WALLPAPER_HINTSandroid.permission.SUBSCRIBED_FEEDS_READandroid.permission.TRANSMIT_IRandroid.permission.USE_FINGERPRINTandroid.permission.VIBRATEandroid.permission.WAKE_LOCKandroid.permission.WRITE_SYNC_SETTINGScom.android.alarm.permission.SET_ALARMcom.android.launcher.permission.INSTALL_SHORTCUTcom.android.launcher.permission.UNINSTALL_SHORTCUT
3 所有权限说明:
int checkSelfPermission(String permission) 用来检测应用是否已经具有权限,这个方法是在API23中才有的,为了兼容低版本,建议使用v4包中的ContextCompat.checkSelfPermission,在下面的注意事项中有解释,这里就不在赘述了
void requestPermissions(String[] permissions, int requestCode) 进行请求单个或多个权限,第一个参数是请求的权限集合,第二个参数是请求码,在回调监听中可以用来判断是哪个权限请求的结果
void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 用户对请求作出响应后的回调,请求成功或者失败的监听
shouldShowRequestPermissionRationale这个API可以帮我们判断接下来的对话框是否包含”不再询问“选择框。在6.0之前的版本永远返回的是fasle
//动态权限处理 //////////////// private void requestSDPermissin() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 检查该权限是否已经获取 int i = ContextCompat.checkSelfPermission(this, PERMISSIONS_STORAGE[0]); int i2 = ContextCompat.checkSelfPermission(this, PERMISSIONS_STORAGE[1]); // 权限是否已经 授权 GRANTED---授权 DINIED---拒绝 if (i != PackageManager.PERMISSION_GRANTED || i2 != PackageManager.PERMISSION_GRANTED) { // 如果没有授予该权限,就去提示用户请求 verifyStoragePermissions(); } else { verifyUpdate(); } } else { verifyUpdate(); } } private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; public void verifyStoragePermissions() { int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); } } //动态申请权限结果的回调 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_EXTERNAL_STORAGE && grantResults.length > 0) { int temp = 0; for (int i = 0; i < grantResults.length - 1; i++) { if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { temp = -1; break; } } if (temp == 0) { verifyUpdate(); }// if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)){// ToastUtil.BUILDER.showCenterToast("true");// }else {// ToastUtil.BUILDER.showCenterToast("false");// } } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }
- 安卓M 6.0动态权限的问题
- 安卓6.0以上动态权限问题
- 安卓6.0 的动态权限
- 安卓6.0动态权限申请问题,可见链接
- 安卓6.0注意的权限问题
- 安卓的权限问题
- 关于安卓6.0权限的动态获取
- 安卓6.0 M权限SplashActivity中请求
- 安卓6.0+动态权限申请
- 安卓6.0动态权限配置查询
- 安卓6.0动态获取权限
- 安卓6.0以后动态申请权限
- 安卓6.0动态获取权限
- 安卓6.0动态申请权限
- Android M 新的运行时权限开发者需要知道的一切 (安卓6.0新权限系统)
- unity3d打包在安卓6.0上的权限问题
- 记录一下安卓6.0权限的问题
- 解决安卓6.0拨打电话时的权限问题
- Const 类型
- 机器学习之最大似然算法
- Unix进程之进程概述
- mariadb字符集
- 删数问题
- 安卓M 6.0动态权限的问题
- Unity背包系统(一)使用LitJson库创建并解析Json文件
- iOS 问与答(123-141)
- Servlet学习记录1:tomcat配置
- TCP、UDP、Http、Xmpp 的区别和联系
- 表达式求值
- Oracle之rollUp函数
- android设备使用usb串口传输数据
- Spring学习心得(24)-- Spring事务管理(详解+实例)