项目中处理6.0以上权限问题

android 6.0对于权限管理比较收紧,所以在适配android 6.0的时候就颇有必要考虑一些权限管理的问题。java

若是你没适配6.0的设备而且权限没给的话,就会出现相似以下的问题:android

java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:xxxxxxxxxxx cmp=com.android.server.telecom/.components.UserCallActivity } from ProcessRecord{b83b87a 16850:com.chexiu.sales/u0a34} (pid=16850, uid=10034) with revoked permission android.permission.CALL_PHONE

google官方权限分类:git

以下为正常的权限:github

复制代码
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
复制代码

以下为危险权限:app

复制代码
group:android.permission-group.CONTACTS
  permission:android.permission.WRITE_CONTACTS
  permission:android.permission.GET_ACCOUNTS
  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 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 permission:android.permission.ACCESS_COARSE_LOCATION 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 permission:android.permission.RECEIVE_MMS permission:android.permission.RECEIVE_SMS permission:android.permission.SEND_SMS permission:android.permission.READ_CELL_BROADCASTS
复制代码

那么问题来了,由于这些危险权限致使app在6.0上面崩溃就不该该,因此要找好的方法来解决问题:ide

库的地址:https://github.com/mylhyl/AndroidAcpgradle

项目中的集成和使用:ui

1,gradle集成:google

compile 'com.mylhyl:acp:1.1.5'

2,代码集成进来,方便修改spa

我采用2的方式

而后看下实际项目中的使用:

好比针对拨打电话权限的6.0适配:

复制代码
  /** * 直接拨打电话 */ public static boolean intentToCall(final Context context, final String phoneNumber) { if (context == null || StringUtil.isEmpty(phoneNumber)) { return false; } //6.0权限处理 Acp.getInstance(context).request(new AcpOptions.Builder().setPermissions( Manifest.permission.CALL_PHONE).build(), new AcpListener() { @Override public void onGranted() { Uri u = Uri.parse("tel:" + phoneNumber); Intent it = new Intent(Intent.ACTION_CALL, u); context.startActivity(it); } @Override public void onDenied(List<String> permissions) { } }); return true; }
复制代码

链式调用,提供受权和受权失败两种状况处理

若是提供权限会调用onGranted(){}方法,你只须要在里面添加受权后的操做就行。

若是受权失败会调用onDenied(){}方法,你能够提醒用户受权失败,并进行后续操做。

而且该库具备以下特色:

  • 支持批量权限申请,不须要重写 onRequestPermissionsResult 方法,Activity 与 Fragment 中用法一致,一句话搞定。
  • 处理权限拒绝,或勾选再也不询问,致使不能正常使用功能的提示框,支持跳转设置权限界面开启权限,全部提示框文字可自定义。
  • 兼容小米跳转权限设置
  • 增长M版本检测

固然建议代码集成到项目中来,后期万一修改也比较方便

相关文章
相关标签/搜索