转载请注明出处:http://blog.csdn.net/smartbetter/article/details/52778023

尽管Android正在被不断开发,但Android 6.0是完全不同的,对于Android 6.0的几个主要的变化,查看查看官网的这篇文章:
http://developer.android.com/intl/zh-cn/about/versions/marshmallow/android-6.0-changes.html
其中当然包含Runtime Permissions。

本篇文章目的就是让开发者能轻松解决一些运行时权限的问题。

新的权限获取方式除了要求像之前版本一样在AndroidManifest文件中静态申请之外,应用还需根据需要请求权限,方式采用向用户显示一个请求权限的对话框。这些被动态申请的权限可以在系统设置中被手动关闭。另外,对于类别为NORMAL(正常)的权限,仍然只需要在AndroidManifest文件中静态申请,系统安装时会直接获取,对于Dangerous(危险)权限则需要在Java代码中作处理。

Normal Permissions如下:

ACCESS_LOCATION_EXTRA_COMMANDSACCESS_NETWORK_STATEACCESS_NOTIFICATION_POLICYACCESS_WIFI_STATEBLUETOOTHBLUETOOTH_ADMINBROADCAST_STICKYCHANGE_NETWORK_STATECHANGE_WIFI_MULTICAST_STATECHANGE_WIFI_STATEDISABLE_KEYGUARDEXPAND_STATUS_BARGET_PACKAGE_SIZEINSTALL_SHORTCUTINTERNETKILL_BACKGROUND_PROCESSESMODIFY_AUDIO_SETTINGSNFCREAD_SYNC_SETTINGSREAD_SYNC_STATSRECEIVE_BOOT_COMPLETEDREORDER_TASKSREQUEST_INSTALL_PACKAGESSET_ALARMSET_TIME_ZONESET_WALLPAPERSET_WALLPAPER_HINTSTRANSMIT_IRUNINSTALL_SHORTCUTUSE_FINGERPRINTVIBRATEWAKE_LOCKWRITE_SYNC_SETTINGS

Dangerous Permissions如下(权限组的形式):

group:android.permission-group.CONTACTS    permission:android.permission.WRITE_CONTACTS    permission:android.permission.GET_ACCOUNTS    permission:android.permission.READ_CONTACTSgroup: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_VOICEMAILgroup:android.permission-group.CALENDAR    permission:android.permission.READ_CALENDAR    permission:android.permission.WRITE_CALENDARgroup:android.permission-group.CAMERA    permission:android.permission.CAMERAgroup:android.permission-group.SENSORS    permission:android.permission.BODY_SENSORSgroup:android.permission-group.LOCATION    permission:android.permission.ACCESS_FINE_LOCATION    permission:android.permission.ACCESS_COARSE_LOCATIONgroup:android.permission-group.STORAGE    permission:android.permission.READ_EXTERNAL_STORAGE    permission:android.permission.WRITE_EXTERNAL_STORAGEgroup:android.permission-group.MICROPHONE    permission:android.permission.RECORD_AUDIOgroup: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

注:如果你申请某个Dangerous Permissions,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。开发的时候不要对权限组有过多依赖,尽可能对每个危险权限都进行正常的权限申请。

下面我们来进行Android 6.0的适配工作:

1.Android 6.0 运行时权限处理

(1)在AndroidManifest文件中添加需要的权限(我们假设权限xx);

<uses-permission android:name="android.permission.xx" />

(2)在Java代码中进行动态授权:

private static final int REQUEST_XX_PERMISSION=10;/** * 这个方法在需要进行授权的地方调用 */private void requestXxPermission(){    //判断系统版本    if (Build.VERSION.SDK_INT >= 23) {        //检测当前app是否拥有某个权限        int checkCallPhonePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.xx);        //判断这个权限是否已经授权过        if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){            //判断是否需要 向用户解释,为什么要申请该权限,该方法只有在用户在上一次已经拒绝过你的这个权限申请才会调用。            if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.xx))                Toast.makeText(this,"Need xx permission.",Toast.LENGTH_SHORT).show();            /** * 参数1 Context * 参数2 需要申请权限的字符串数组,支持一次性申请多个权限,对话框逐一询问 * 参数3 requestCode 主要用于回调的时候检测 */            ActivityCompat.requestPermissions(this ,new String[]{Manifest.permission.xx},REQUEST_BLUETOOTH_PERMISSION);            return;        }else{        }    } else {    }}

(3)授权回调处理

@Overridepublic void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){    switch(permsRequestCode){        case REQUEST_XX_PERMISSION:            if (grantResults.length > 0                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                //授权成功            } else {                //授权拒绝            }            break;    }}

对于权限的申请结果,首先验证requestCode定位到你的申请,然后验证grantResults对应于申请的结果,这里的数组对应于申请时的第二个权限字符串数组。如果你同时申请两个权限,那么grantResults的length就为2,分别记录你两个权限的申请结果。如果申请成功,就可以做你的事情了。

2.案例一 适配Android 6.0 蓝牙

(1)在AndroidManifest文件中添加需要的权限;

<uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  <uses-feature  android:name="android.hardware.bluetooth_le" android:required="true" />

(2)在Java代码中进行动态授权(这里以蓝牙权限为例):

private static final int REQUEST_BLUETOOTH_PERMISSION=10;private void requestBluetoothPermission(){    //判断系统版本    if (Build.VERSION.SDK_INT >= 23) {        //检测当前app是否拥有某个权限        int checkCallPhonePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION);        //判断这个权限是否已经授权过        if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){            //判断是否需要 向用户解释,为什么要申请该权限            if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION))                Toast.makeText(this,"Need bluetooth permission.",Toast.LENGTH_SHORT).show();            ActivityCompat.requestPermissions(this ,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},REQUEST_BLUETOOTH_PERMISSION);            return;        }else{        }    } else {    }}

(3)此处为简化处理就不作授权回调处理了。

更多相关文章

  1. 利用drozer进行Android渗透测试
  2. Android一键锁屏代码
  3. 利用drozer进行Android渗透测试
  4. 申请Android(安卓)google map的apiKey
  5. Android(安卓)Service待机/睡眠时运行
  6. 如何申请Android(安卓)MapView的apiKey
  7. android通过chmod命令实现文件权限修改
  8. Android(安卓)拨打电话功能
  9. android APP 获得system权限

随机推荐

  1. Android(安卓)中文 API (90) ―― Window
  2. Android常用代码之普通及系统权限静默安
  3. 再说Android中实现全屏的方法
  4. GPS 研究一 (Android2.3)
  5. (Android)用Socket的小例子
  6. Android(安卓)IMF 学习笔记三
  7. Android通知Notification详解
  8. Android(安卓)4.0 的发布了
  9. LeakCanary源码分析
  10. Android(安卓)Opencv 410 集成 以及 jni