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(安卓)GpioService从app到驱动
- Android(安卓)EditText的使用及值得注意的地方
- iOS企业包下载安装
- Android安全警告:新Android短信木马:DroidLive--伪装成google类库
- Android(安卓)Things:用户驱动-传感器
- Handler Message 消息机制和AsyncTask异步处理android数据交互
- GPS定位与高德地图的使用
- 一起学android之对话框Dialog的创建(7)
- Inflate()---Android之Inflate()方法用途