官方地址:https://developer.android.google.cn/guide/topics/security/normal-permissions.html
正常权限涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域:也就是不需要用户同意或拒绝的权限。
下面是一些正常权限:截止到api23 也就是6.0系统
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。
同一个权限组的权限不会多次提示,只要有一个同意了,其他的就可以直接使用
权限组 | 权限 |
---|---|
CALENDAR | READ_CALENDAR |
RITE_CALENDAR | |
CAMERA | CAMERA |
CONTACTS | READ_CONTACTS |
WRITE_CONTACTS | |
GET_ACCOUNTS | |
LOCATION | ACCESS_FINE_LOCATION |
ACCESS_COARSE_LOCATION | |
MICROPHONE | RECORD_AUDIO |
PHONE | READ_PHONE_STATE |
CALL_PHONE | |
READ_CALL_LOG | |
WRITE_CALL_LOG | |
ADD_VOICEMAIL | |
USE_SIP | |
PROCESS_OUTGOING_CALLS | |
SENSORS | BODY_SENSORS |
SMS | SEND_SMS |
RECEIVE_SMS | |
READ_SMS | |
RECEIVE_WAP_PUSH | |
RECEIVE_MMS | |
STORAGE | READ_EXTERNAL_STORAGE |
WRITE_EXTERNAL_STORAGE |
google官方也给我提供了如何自定义权限的例子:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp" >
<permission android:name="com.example.myapp.permission.DEADLY_ACTIVITY"
android:label="@string/permlab_deadlyActivity"
android:description="@string/permdesc_deadlyActivity"
android:permissionGroup="android.permission-group.COST_MONEY"
android:protectionLevel="dangerous" />
...
</manifest>
由于系统不允许带有不同签名的应用使用相同的权限声明,所以在命名的时候我们也需要按照反域名的方式。
protectionLevel这个属性是必要属性:当然他的值有很多可选项:常见的有四种
name | value | description |
---|---|---|
normal | 0 | 普通的很低级的权限,只需要声明不需要用户手动允许的权限(正常权限) |
dangerous | 1 | 危险的权限,需要用户手动允许的权限 |
signature | 2 | 拥有相同签名的软件采用有的权限 |
signatureOrSystem | 3 | 系统和相同签名拥有的权限 |
… |
permissionGroup是一个可选的属性就是属于那个权限组:我们一般默认就是android.Manifest.permission_group
需要为权限提供标签和描述。这些是用户在查看权限列表(android:label)或单一权限详细信息(android:description)时可以看到的字符串资源。标签应简短;用几个词描述权限保护的功能的关键部分。描述应该用几个句子描述权限允许持有人执行的操作。我们的约定是用两个句子描述:第一句描述权限,第二句向用户提醒为应用授予权限后可能出现的错误类型。
<string name="permlab_callPhone">directly call phone numbers</string>
<string name="permdesc_callPhone">Allows the application to call
phone numbers without your intervention. Malicious applications may
cause unexpected calls on your phone bill. Note that this does not
allow the application to call emergency numbers.</string>
您可以使用 Settings 应用和 shell 命令 adb shell pm list permissions 查看系统中当前定义的权限。要使用 Settings 应用,请转到 Settings > Applications。选择一个应用并向下滚动查看该应用使用的权限。对于开发者,adb ‘-s’ 选项以类似于用户将会看到的形式显示权限:
$ adb shell pm list permissions -s
All Permissions:
Network communication: view Wi-Fi state, create Bluetooth connections, full
Internet access, view network state
Your location: access extra location provider commands, fine (GPS) location,
mock location sources for testing, coarse (network-based) location
Services that cost you money: send SMS messages, directly call phone numbers
...
检查权限还有许多其他有用的方法。如果您有另一个进程的 pid,可以使用 Context 方法 Context.checkPermission(String, int, int) 检查针对该 pid 的权限。如果您有另一个应用的软件包名称,可以使用直接的 PackageManager 方法 PackageManager.checkPermission(String, String) 了解是否已为特定软件包授予特定权限。