Android 6.0权限动态申请适配

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,打完收工,希望对大家有所帮助

你可能感兴趣的:(Android,权限)