当前位置:   article > 正文

Android系统安全权限

Android系统安全权限

Android 安全架构的中心设计点是:在默认情况下任何应用都没有权限执行对其他应用、操作系统或用户有不利影响的任何操作。这包括读取或写入用户的私有数据(例如联系人或电子邮件)、读取或写入其他应用程序的文件、执行网络访问、使设备保持唤醒状态等。

从 Android 6.0(API 级别 23)开始,无论您的应用面向哪个 API 级别,您都应对应用进行测试,以验证它在缺少需要的权限时行为是否正常。

应用可以通过 Activity,Fragment,和 Context 类(建议使用 Support 包中的对应类,如 ContextCompat)中三个方法和一个回调,与用户协调动态权限的授权:

对于两个特殊权限 SYSTEM_ALERT_WINDOW 和 WRITE_SETTINGS,必须通过下面的方式判断授权情况,并通过 startActivity 来跳转到权限设置页去授权:

对于location权限,还需要通过 LocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)判断是否打开定位开关。

在使用 Android 权限时,需要遵循以下原则:

1、最少原则,只使用 APP 所必需的权限。可能还有其他方法能实现同样的需求,而无需访问敏感信息。

2、全面原则,应用需考虑第三方库所需的权限,当 APP 包含一个库时,会继承其权限要求。

3、清晰原则,当您发出权限请求时,要让用户明白正在访问的内容以及为什么要访问,以便用户做出明智的决定。

4、显式原则,当您访问敏感功能(例如相机或麦克风)时,提供连续的提示可以让用户清楚您在收集数据,避免让用户感觉您在偷偷收集数据。

例如,您需要用设备的 Camera 来拍照,你可以通过调用 Camera 的 API 来实现这个功能,但是这需要请求 Camera 的权限;你也可以你 Intent 启动 Camera 模块来实现这个功能,但是不需要请求 Camera 的权限。

例如,媒体播放器在通话期间静音或暂停,是使用 PhoneStateListener 监听呼叫状态的更改或监听android.intent.action.PHONE_STATE的广播。该解决方案的问题是它需要 READ_PHONE_STATE权限,这需要用户同意访问敏感数据(例如其设备和 SIM 硬件 ID 以及来电的电话号码)。您可以通过为您的应用请求 AudioFocus 来避免这种情况,因为它不需要明确的权限(因为它不访问敏感信息)。只需将音频切换到后台时所需的代码放在 onAudioFocusChange()事件处理程序中,当操作系统移动切换其音频焦点时它将自动运行。

  • 普通权限(normal permission):也叫正常权限,即使拥有了该类权限,用户的隐私数据被泄露篡改的风险也很小。例如,设置时区的权限就是正常权限。如果应用声明其需要正常权限,系统会自动向应用授予该权限。
  • 敏感权限(dangerous permission):也叫危险权限,运行时权限,跟普通权限相反,一旦某个应该获取了该类权限,用户的隐私数据就面临被泄露篡改的风险。比如 READ_CONTACTS 权限就属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。
  • 签名权限(signature permission):该类权限只对拥有相同签名的应用开放,比如手机QQ 自定义了一个permission 且在权限标签中加入 android:protectionLevel=”signature”,而访问它的某个数据时,必须要拥有该权限。然后微信和 QQ 发布时采用相同的签名,微信就可以申请访问 QQ 中的此权限,并使用对应权限控制的数据。其他程序即使知道了这个开放数据的接口,也在 Manifest 注册了权限,但由于应用签名不同,还是无法访问的对应的数据。
  • 系统签名权限(signatureOrSystem permission):与 signature permission类似,但它不光要求签名相同,还要求是同类的系统级应用,一般手机厂商开发的预制应用,才会用到该类权限。
  • 动态权限机制及使用

    从 Android 6.0(API级别 23)开始,用户开始在应用运行时向其授予危险权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限。用户可以随时进入应用的“Settings”中调整应用的动态权限授权。

    在所有版本的 Android 中,您应用都需要在其应用 Manifest 中同时声明它需要的正常权限和危险权限。不过,该声明的影响因系统版本和应用的 targetSdkVersion的不同而有所差异:

  • 如果设备运行的是 Android 5.1 或更低版本,或者应用的 targetSdkVersion 为 22 或更低:如果您在 Manifest 中列出了危险权限,则用户必须在安装应用时授予此权限;如果他们不授予此权限,系统根本不会安装应用。如果将新权限添加到更新的应用版本,系统会在用户更新应用时要求授予该权限。用户一旦安装应用,他们撤销权限的唯一方式是卸载应用。
  • 如果设备运行的是 Android 6.0 或更高版本,并且应用的 targetSdkVersion为23 或更高:应用必须在 Manifest 中列出权限,并且它必须在运行时请求其需要的每项危险权限。用户可以授予或拒绝每项权限,且即使用户拒绝权限请求,应用仍可以继续运行有限的功能。
  • checkSelfPermission:检查动态权限,返回PackageManager.PERMISSION_GRANTED或PackageManager.PERMISSION_DENIED
  • shouldShowRequestPermissionRationale:检查用户禁止了此动态权限框跳出,应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
  • requestPermissions:请求动态权限,系统会弹出权限授权提示框给用户,用户可以选择授权和拒绝。选择结果通过 Activity 或 Fragment 的 onRequestPermissionsResult 接受。
  • onRequestPermissionsResult:动态权限申请结果,根据请求的requestCode和grantResults是否PERMISSION_GRANTED来判断用户是否授权。
  • Settings.canDrawOverlays()。
  • Settings.System.canWrite()。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/674831
推荐阅读
相关标签
  

闽ICP备14008679号