Android 6.0权限动态申请适配
最近发现应用的相关权限申请失败,导致出现了不好的用户体验。然后就然后你懂的,做了一波6.0及以上版本的动态权限的适配。
虽然很简单,还是记录下。
从Android的6.0版本(API是23)开始,用户开始运行应用时动态获取应用所需的权限,这样增加了app的安全性,增加了用户的不方便,需要手动,或者弹框确定权限申请。6.0以下默认获取Mainifest中申请的权限。Android的权限分为敏感和正常的权限。
Normal Permissions:
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
Dangerous Permissions:
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
敏感的权限是需要我们去动态申请的,当然是Android 6.0以上的版本哦。权限分为以上的组合,默认申请组中的一个权限,就可以获取到同一个组下的所有权限。具体可以参考android.Manifest.permission的类。
下面讲下具体的方法
1.判断当前是否有相应的权限
//检测权限是否申请通过
public boolean checkPermissionHave(String permission) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
}
boolean isHave = ContextCompat.checkSelfPermission(mActivity, permission) ==
PackageManager.PERMISSION_GRANTED;
return isHave;
}
2.申请相应的权限
//申请单个权限 responseCode Activity.onRequestPermissionsResult的返回断
//responseCode是activity中的返回对应的code
public void requesSinglePermission(String permission, int responseCode) {
if (mActivity == null || TextUtils.isEmpty(permission)) {
return;
}
//判断当前系统是否高于或等于6.0
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return;
}
if (ContextCompat.checkSelfPermission(mActivity, permission) == PackageManager.PERMISSION_GRANTED) {
//有相应的权限
} else {
//进行权限申请
ActivityCompat.requestPermissions(mActivity, new String[]{permission}, responseCode);
}
}
3.申请权限的返回处理
//activity的自带方法
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//判断相关的权限是否获取到了,做下一步处理
}
4.判断当前的申请权限是否会弹系统的权限框
//检测申请权限是否会弹框
public boolean checkShowRequestDialog(String permission) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return false;
}
if(TextUtils.isEmpty(permission)){
return true;
}
boolean isShowRequestDialog = ActivityCompat.shouldShowRequestPermissionRationale(mActivity, permission);
return isShowRequestDialog;
}
Tips:系统权限框展示后,用户点击关闭,选择永不提示。下一次的就不会弹出权限的申请框。这边需要独立处理
5.跳转到应用的设置页面,其他的自行处理
//跳转设置页面
public void goToSetting(int returnCode) {
Intent mIntent = new Intent();
// mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
mIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
mIntent.setData(Uri.fromParts("package", mActivity.getPackageName(), null));
} else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) {
mIntent.setAction(Intent.ACTION_VIEW);
mIntent.setClassName("com.android.settings", "com.android.setting.InstalledAppDetails");
mIntent.putExtra("com.android.settings.ApplicationPkgName", mActivity.getPackageName());
}
mActivity.startActivityForResult(mIntent,returnCode);
}
是不是非常的简单,so easy,ok,打完收工,希望对大家有所帮助