转载: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);     } } 

更多相关文章

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

随机推荐

  1. 基于 Babel 的 npm 包的最小化设置 [每日
  2. 一文学懂 TypeScript 的类型 [每日前端夜
  3. 通过 Web 控制蓝牙设备:WebBluetooth入门
  4. 7个 Javascript 面试题及回答策略 [每日
  5. JavaScript 高阶函数快速入门 [每日前端
  6. 分享十张表的数据!大家一起玩!
  7. 2019年 Vue.js 报告中的亮点 [每日前端夜
  8. 用python重新定义【2019十大网络流行语】
  9. 用 Node.js 写一个多人游戏服务器引擎 [
  10. 三十天写三十个网站后,我学到的东西[每日