Android6.0权限的使用

时间:2022-11-08 15:25:38

Android6.0权限的使用

随着Android发布的版本原来越高,Android6.0新增加的动态权限不仅提高了用户体验,还增加了用户对于使用过程中隐私数据的保护,还使的开发者作出了相应的改变。

Android是一个权限分隔的操作系统,其中每个应用都有其独特的系统标准识别(Linux用户ID和组ID),系统各部分也分隔为不同的标识。Linux据此将不同的应用以及应用与系统分隔开来。

应用沙盒不依赖用于开发应用的技术。特别是,Dalvik VM 不是安全边界,任何应用都可运行原生代码(请参阅 Android NDK)。各类应用 — Java、原生和混合 — 以同样的方式放在沙盒中,彼此采用相同程度的安全防护

证书在 Android 中的作用是识别应用的作者。这允许系统授予或拒绝应用对签名级权限的访问,以及授予或拒绝应用获得与另一应用相同的 Linux 身份的请求

必须要支持运行时权限么

目前应用实际上是可以不需要支持运行时权限的,但是最终肯定还是需要支持的,只是时间问题而已。

想要不支持运行时权限机制很简单,只需要将targetSdkVersion设置低于23就可以了,意思是告诉系统,我还没有完全在API 23(6.0)上完全搞定,不要给我启动新的特性。


android安全性概览

http://source.android.com/tech/security/index.html

列出系统上的权限:

adb shell pm list permissions

声明权限:系统权限介绍

https://developer.android.google.cn/guide/topics/security/permissions.html#normal-dangerous

每一款App应用都应该在自己的安全沙箱中运行,如果需要使用安全沙箱之外的资源和信息,则需要使用权限。需要的清单文件中添加权限。

1.权限分类

1.normal
2.dangerous
3.signature
4.singnatureOrSystem

2.权限组

3.自定义权限

可能在程序运行期间的多个位置实施特定权限:

1.在调用系统时,防止应用执行某些功能。
2.在启动 Activity 时,防止应用启动其他应用的 Activity。
3.在发送和接收广播时,控制谁可以接收您的广播,谁可以向您发送广播。
4.在访问和操作内容提供程序时。
5.绑定至服务或启动服务。

正常权限和危险权限

系统权限分为几个保护级别。需要了解的两个最重要保护级别是正常权限和危险权限:

正常权限涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。例如,设置时区的权限就是正常权限。如果应用声明其需要正常权限,系统会自动向应用授予该权限。如需当前正常权限的完整列表,请参阅正常权限。
危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限

正常权限列表

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
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
SET_ALARM
INSTALL_SHORTCUT
UNINSTALL_SHORTCUT


上述的权限基本设计的是关于网络,蓝牙,时区,快捷方式等方面,只要在Manifest指定了这些权限,就会被授予,并且不能撤销。

权限组

所有危险的 Android 系统权限都属于权限组。如果设备运行的是 Android 6.0(API 级别 23),并且应用的 targetSdkVersion 是 23 或更高版本,则当用户请求危险权限时系统会发生以下行为:

如果应用请求其清单中列出的危险权限,而应用目前在权限组中没有任何权限,则系统会向用户显示一个对话框,描述应用要访问的权限组。对话框不描述该组内的具体权限。例如,如果应用请求 READ_CONTACTS 权限,系统对话框只说明该应用需要访问设备的联系信息。如果用户批准,系统将向应用授予其请求的权限。
如果应用请求其清单中列出的危险权限,而应用在同一权限组中已有另一项危险权限,则系统会立即授予该权限,而无需与用户进行任何交互。例如,如果某应用已经请求并且被授予了 READ_CONTACTS 权限,然后它又请求 WRITE_CONTACTS,系统将立即授予该权限。

在了解了Android系统的权限概念之后,我没对Android中使用的权限进行操作:
1.自定义权限的使用 2.6.0动态权限的处理
1.自定义权限
<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>
您可以通过 AndroidManifest.xml 应用高级权限,限制访问系统或应用的全部组件。要执行此操作,在所需的组件上包含 android:permission 属性,为用于控制访问它的权限命名。
对于四大组件中的权限使用: 1.在没有权限的情况下开启Activity,service时会抛出SecurityException异常。 2.在广播的sendBroadcast()时,不会导致向掉用方抛出异常,只是不会传递intent 3.对contentProvider的权限控制可以分为读写Uri控制

其他权限实施

Context.checkCallingPermission() 
Context.checkPermission(String, int, int)
PackageManager 方法 PackageManager.checkPermission(String, String)
URI 权限
到目前为止所述的是标准权限系统,内容提供程序仅仅使用此系统通常是不够的。内容提供程序可能需要通过读取和写入权限保护自己,而其直接客户端也需要将特定 URI 传给其他应用以便于它们运行。邮件应用中的附件是一个典型的示例。应通过权限保护对邮件的访问,因为这是敏感的用户数据。但是,如果将图像附件的 URI 提供给图像查看程序,该图像查看程序不会有打开附件的权限,因为它没有理由拥有访问所有电子邮件的权限。

此问题的解决方法是采用 per-URI 权限机制:在启动 Activity 或返回结果给 Activity 时,调用方可以设置 Intent.FLAG_GRANT_READ_URI_PERMISSION 和/或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION。这将授予接收 Activity 权限访问 intent 中的特定数据 URI,而不管它是否具有访问 intent 对应的内容提供程序中数据的任何权限。

此机制支持常见的能力式模型,其中用户交互(打开附件、从列表中选择联系人等)驱动临时授予细化的权限。这是一项关键功能,可将应用所需的权限缩小至只与其行为直接相关的权限。

但授予细化的 URI 权限需要与拥有这些 URI 的内容提供程序进行一定的合作。强烈建议内容提供程序实施此功能,并且通过 android:grantUriPermissions 属性或 <grant-uri-permissions> 标记声明支持此功能。

在 Context.grantUriPermission()、Context.revokeUriPermission() 和 Context.checkUriPermission() 方法中可以找到更多信息。


多系统问题

当我们支持了6.0必须也要支持4.4,5.0这些系统,所以需要在很多情况下,需要有两套处理。比如Camera权限

1
2
3
4
5
if (isMarshmallow()) {
requestPermission();//然后在回调中处理
} else {
useCamera();//低于6.0直接使用Camera
}
多系统问题:
当我们支持了6.0必须也要支持4.4,4.5这些系统,所以需要在很多情况下,需要有两套处理。比如Camera权限


参考:
http://droidyue.com/blog/2016/01/17/understanding-marshmallow-runtime-permission/