在 android 6.0 运行时我们需要哪些权限

Posted

技术标签:

【中文标题】在 android 6.0 运行时我们需要哪些权限【英文标题】:Which permission do we need at runtime in android 6.0 【发布时间】:2016-12-22 17:21:50 【问题描述】:

我有一个可以在 android 5.0 版本上正常运行的 android 代码。我的AndroidManifest.xml

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />

但是,我使用 Android 6.0 (LG G5) 的客户报告说该应用程序无法正常运行。我没有 LG G5 来检查问题所在。在我看来,我认为原因是权限从 5.0 更改为 6.0。您能否查看我的许可并针对 Android 6.0 进行一些改进/纠正?或者我们有什么方法可以自动为 Android 6.0 添加权限。谢谢大家

【问题讨论】:

您是否针对 api 版本 23 ? 是的。首先,我在Android 5.0(21~22)上测试过,没有问题。现在,我想更改目标 API 版本 23 WRITE_EXTERNAL_STORAGE 是一个危险的权限。请查看developer.android.com/guide/topics/security/permissions.html中的危险权限列表 绿巨人为你添加了列表。请添加必要的更改。 【参考方案1】:

在Android 6.0 中,这包括:

ACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
ADD_VOICEMAIL
BODY_SENSORS
CALL_PHONE
CAMERA
GET_ACCOUNTS
PROCESS_OUTGOING_CALLS
READ_CALENDAR
READ_CALL_LOG
READ_CELL_BROADCASTS
READ_CONTACTS
READ_EXTERNAL_STORAGE
READ_PHONE_STATE
READ_SMS
RECEIVE_MMS
RECEIVE_SMS
RECEIVE_WAP_PUSH
RECORD_AUDIO
SEND_SMS
USE_SIP
WRITE_CALENDAR
WRITE_CALL_LOG
WRITE_CONTACTS
WRITE_EXTERNAL_STORAGE

对于这些权限,不仅您的 targetSdkVersion 23+ 应用需要具有元素,而且您还必须在运行时向 Android 6.0+ 设备上的用户请求这些权限,使用方法如 checkSelfPermission()和 requestPermissions()。

How to ask permission link

【讨论】:

谢谢。所以我需要的是通过编程请求权限。它会询问用户,然后自动为我的应用添加。这样对吗?再次运行应用时是否会询问第二次? 你好 user8430,这个问题是关于列表的,所以首先批准你回答并打开另一个关于如何请求权限的问题,我会帮你的,祝你好运:) 我赞成你的回答。我不知道谁反对它【参考方案2】:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

这些是危险权限,您需要在运行时在 API 级别 23+ 上请求它们。

完整的危险权限列表见here。

查看Requesting Permissions at Run Time 上的开发人员指南。

【讨论】:

因此,不要在AndroidManifest.xml 文件中添加上述两个权限。我必须使用 requestPermission() 函数来添加这些权限 onCreate() 函数。对吗? 对于 API 级别较低的设备,您还需要在清单中包含它们。在onCreate() 中请求它们不是强制性的,只需在调用任何需要它们的函数之前请求它们。【参考方案3】:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

这些权限将是您应用中的运行时权限

更多信息:

https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en

看看这对你有帮助

【讨论】:

我的问题的好链接【参考方案4】:

在您的应用程序中,必须在运行时而不是在应用程序安装时获取权限。 根据文档,android.permission.WRITE_EXTERNAL_STORAGE 是一个危险的权限,您可以查看此Dyanamic permission in 6.0

【讨论】:

【参考方案5】:

在 Android Marshmallow 中,权限管理与以前的版本完全不同。如果您以 API 23 为目标,则必须请求用户允许该应用授予此或该权限。

看看: Android permissions

我认为(未经测试)如果您将 API 设置为 22 或更低,尽管该应用程序安装在 Android 6.0+ 的设备中,但您不会遇到权限问题

【讨论】:

【参考方案6】:

Android 6 改进了 android 处理应用权限的方式,如果您的应用需要危险权限(此处为完整列表 https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous),您需要检查权限运行时,因此在清单中定义权限是不够的。 这种新权限管理的原因与 android 用户可以启用/禁用应用程序权限运行时这一事实有关,因此您的代码需要注意默认情况下不授予特定功能(相机、gps 等)并且可能会随着时间而改变。

帮助管理应用权限的库有很多,我觉得用的最多的是Permissions Dispatcher:https://github.com/hotchemi/PermissionsDispatcher

也可以在这里查看官方文档:https://developer.android.com/training/permissions/requesting.html

【讨论】:

以上是关于在 android 6.0 运行时我们需要哪些权限的主要内容,如果未能解决你的问题,请参考以下文章

Android 6.0 新特性

谈谈Android 6.0运行时权限理解

Android数据存储之Android 6.0运行时权限下文件存储的思考

Android 6.0 运行时权限管理

Android 6.0版本以后运行时权限提醒

Android 6.0以上 需要运行时申请的权限