android6.0M系统在代码中实现请求以及检查权限。

转载:http://mdsa.51cto.com/art/201508/489882_all.htm
新运行时权限
android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次。一旦安装了,app可以在用户毫不知晓的情况下访问权限内的所有东西。会被有意人利用这个缺陷恶意的收集用户数据!
android小组也知道这事儿。7年了!权限系统终于被重新设计了。在android6.0棉花糖,app将不会在安装的时候授予权限。取而代之的是,app不得不在运行时一个一个询问用户授予权限。注意权限询问对话框不会自己弹出来。开发者不得不自己调用。如果开发者要调用的一些函数需要某权限而用户又拒绝授权的话,函数将抛出异常直接导致程序崩溃。
PROTECTION_NORMAL类权限(安装时授权的一类基本权限)只需要在AndroidManifest.xml中简单声明这些权限就好,安装时就授权。不需要每次使用时都检查权限,而且用户不能取消以上授权
这类权限包括:

android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 
android.permission.ACCESS_NETWORK_STATE 
android.permission.ACCESS_NOTIFICATION_POLICY 
android.permission.ACCESS_WIFI_STATE 
android.permission.ACCESS_WIMAX_STATE 
android.permission.BLUETOOTH 
android.permission.BLUETOOTH_ADMIN 
android.permission.BROADCAST_STICKY 
android.permission.CHANGE_NETWORK_STATE 
android.permission.CHANGE_WIFI_MULTICAST_STATE 
android.permission.CHANGE_WIFI_STATE 
android.permission.CHANGE_WIMAX_STATE 
android.permission.DISABLE_KEYGUARD 
android.permission.EXPAND_STATUS_BAR 
android.permission.FLASHLIGHT 
android.permission.GET_ACCOUNTS 
android.permission.GET_PACKAGE_SIZE 
android.permission.INTERNET 
android.permission.KILL_BACKGROUND_PROCESSES 
android.permission.MODIFY_AUDIO_SETTINGS 
android.permission.NFC 
android.permission.READ_SYNC_SETTINGS 
android.permission.READ_SYNC_STATS 
android.permission.RECEIVE_BOOT_COMPLETED 
android.permission.REORDER_TASKS 
android.permission.REQUEST_INSTALL_PACKAGES 
android.permission.SET_TIME_ZONE 
android.permission.SET_WALLPAPER 
android.permission.SET_WALLPAPER_HINTS 
android.permission.SUBSCRIBED_FEEDS_READ 
android.permission.TRANSMIT_IR 
android.permission.USE_FINGERPRINT 
android.permission.VIBRATE 
android.permission.WAKE_LOCK 
android.permission.WRITE_SYNC_SETTINGS 
com.android.alarm.permission.SET_ALARM 
com.android.launcher.permission.INSTALL_SHORTCUT 
com.android.launcher.permission.UNINSTALL_SHORTCUT 

运行时权限(被分组了):

同一组的任何一个权限被授权了,其他权限也自动被授权。例如,一旦WRITE_CONTACTS被授权了,app也有READ_CONTACTS和GET_ACCOUNTS了。
app支持新运行时权限步骤、新权限模型工作过程
例子:添加联系人,需要WRITE_CONTACTS权限。如果不询问授权,app就出现FC。
【步骤】
1、像以前一样在AndroidManifest.xml添加声明权限

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

2、检查有没有权限,如果没有就弹个对话框询问用户授权。源码中被用来检查和请求权限的方法分别是Activity的checkSelfPermission和requestPermissions。这些方法由api23引入。

final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
 if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) { 
 //requestPermissions执行弹出请求授权对话框
        requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS}, 
                REQUEST_CODE_ASK_PERMISSIONS); 
        return; 
    } else{
    //执行有权限之后的相应操作
    }

3、不论用户同意还是拒绝,activity的onRequestPermissionsResult会被回调来通知结果(通过第三个参数),grantResults,如下:

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
        case REQUEST_CODE_ASK_PERMISSIONS: 
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
                // Permission 允许 

            } else { 
                // Permission 拒绝 
                Toast.makeText(MainActivity.this, "读取联系人被拒绝", Toast.LENGTH_SHORT) 
                        .show(); 
            } 
            break; 
        default: 
            super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 

你可能感兴趣的:(android,app)