关于Android 6.0+ Dangerous Permissions (运行时权限,敏感权限) 《实用篇》

来源:互联网 发布:淘宝怎么进入投诉 编辑:程序博客网 时间:2024/05/18 17:26
1. 什么是权限?
权限是一种安全机制。Android权限主要用于限制应用程序内部,某些具有限制性的功能使用,以及应用程序之间的组件访问。
(通俗来讲,你想拍照就需要相机的权限。没有权限,你就无法使用相机功能。)


2.什么又是敏感权限?
Android6.0之后,首先关注的就是权限机制的变化,Google将权限分为两类,一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的。另一类是Dangerous Permission ,也就是所说的敏感权限,一般是涉及到用户隐私的,需要用户进行授权。


我先来看一下 都有什么权限;
PS :另外需要什么权限直接复制粘贴即可。
Normal Permissions  

 <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.BROADCAST_STICKY"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
    <uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
    <uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
    <uses-permission android:name="android.permission.NFC"/>
    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
    <uses-permission android:name="android.permission.READ_SYNC_STATS"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.REORDER_TASKS"/>
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
    <uses-permission android:name="android.permission.SET_TIME_ZONE"/>
    <uses-permission android:name="android.permission.SET_WALLPAPER"/>
    <uses-permission android:name="android.permission.SET_WALLPAPER_HINTS"/>
    <uses-permission android:name="android.permission.TRANSMIT_IR"/>
    <uses-permission android:name="android.permission.USE_FINGERPRINT"/>
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>


Dangerous Permissions
 以下 是 Android 6.0+ (SDK23+)的敏感权限(涉及用户隐私的)和 权限组 
 权限组  当同一组内的一个权限被授权 ,组内的其他权限同时授权
 例如 授权 READ_CONTACTS 的同时 他组内的.WRITE_CONTACTS 和GET_ACCOUNTS 也已经被授权

 <!-- CALENDAR 日历组 -->
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
    <!-- CAMERA 相机拍照组 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <!-- CONTACTS 联系人组 -->
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!-- LOCATION 定位组 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- MICROPHONE 麦克风组 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!-- PHONE 组 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
    <uses-permission android:name="android.permission.USE_SIP" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <!-- SENSORS 传感器组 -->
    <uses-permission android:name="android.permission.BODY_SENSORS" />
    <!-- SMS 组 -->
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />
    <!-- STORAGE 存储组 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


无论是 Normal Permissions 类 还是 Dangerous Permissions类,任何权限都需要在 AndroidManifest.xml 里注册。
当你的程序安装到安卓版本6.0以上的手机时,  Normal Permissions 的权限就已经永久授权。
而那些 Dangerous Permissions 根据手机的不同,有的手机实际上是并没有授权的。


运行时权限 (Runtime Permissions)

运行时权限很好理解,就是 程序运行中,动态申请权限。 
拿相机拍照举例。 当点击一个按钮需要调用系统相机的时候, 会弹出一个对话框。

根据手机的不同  对话框的样式也不同。并且,有的对话框 还有 “拒绝后不再询问” 的选项。这个我们稍后说。



既然是动态获取,那就不多说了 直接看代码。


基本流程就是这样。这里需要注意的 ,
 requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 2);  里的String 数组 不建议多个权限在一起 授权。
最好是把功能分开。   需要什么就授权什么。  可以参考Dangerous Permissions 的权限组, 去分别授权。


现在回头说一下  如果客户点击 “拒绝后不再询问” 的选项 怎么办。 
用户拒绝了,真的TMD不会弹对话框了。
但是Google 在 6.0 的系统设置里添加了 权限管理。 每一个程序都有 独立的权限管理页面。 看图




这里所列出来的就是 你 在清单文件里 注册的 所有 敏感权限;这里需要用户手动设置的。
在程序上 所需要做的就是  将逻辑做好。  给好充足的提示。
要是真碰上傻逼 用户,我就只能呵呵了。


本人写了几个项目, 6.0 刚更新的时候 被这个权限机制坑的挺惨,当时市面上用了6.0 的手机不是很多。 恰巧我的项目的  targetSdkVersion  是 23+ 导致没提前做好新版本的预习,栽了跟头。
其实这里还有一个解决办法就是 在 build.gradle  里将 targetSdkVersion  和 compileSdkVersion 改成小于 23。  6.0+ 的系统 会自动识别你的程序是基于老版本开发, 就会 执行老版本的权限授权。
但是我这里不建议这么做。与时俱进吧。过去的东西 早晚会被淘汰。


分享几句名言


如果一开始你没能成功,拿个更大的锤子。 -- 艾伦·路易斯
 如果拿不准一句名言是谁说的,就说是马克·吐温说的。—马克·吐温 

0 0