【发布时间】:2015-07-01 13:22:38
【问题描述】:
Android 权限WRITE_EXTERNAL_STORAGE 和READ_EXTERNAL_STORAGE 会触发Android M 的新授予权限 对话框吗?
【问题讨论】:
标签: android permissions android-6.0-marshmallow
Android 权限WRITE_EXTERNAL_STORAGE 和READ_EXTERNAL_STORAGE 会触发Android M 的新授予权限 对话框吗?
【问题讨论】:
标签: android permissions android-6.0-marshmallow
我同意 Guillaume Perrot 的回答。我在AndroidManifest.xml写READ_WRITE_EXTERNAL_STORAGE的权限时遇到了类似的问题
应用默认不显示权限,需要在应用权限中切换存储的切换按钮。然后我将build.gradle中的targetSdkVersion修改为小于23(MNC)和其他相关的数字sdkVersion,权限安装的应用。
另一种方法是在需要权限的地方写requestpermission函数。代码如下:
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)==
PackageManager.PERMISSION_GRANTED) {
//do the things} else {
requestPermissions(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
AnyNumber);
因为我的声望低于 15,所以我不能投票给 Guillaume Perrot 的答案。就用这种方式来表达我的想法。
【讨论】:
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED) 即使我在设置中撤消了权限,也满足了。然后应用程序失败...
如果检查 Android M 的版本,我解决了添加此问题
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
【讨论】:
我的答案基于我使用模拟器对 M Preview SDK 版本 2 进行的测试。
如果您以 MNC 预览 API 级别为目标,则默认情况下不会授予 WRITE_EXTERNAL_STORAGE 并将成为新动态权限 API 的一部分。
您将在设备设置的新应用权限菜单中看到存储权限作为切换按钮,您可以使用Activity.requestPermissions 显示该权限的弹出窗口。
但是,如果您针对 api 级别 Activity.requestPermissions 编译代码,因为预览版SDK 强制minSdkVersion="MNC" 使用新的API。
这是与位置权限不同的行为:无论您定位的 API 级别是什么,用户都可以在权限菜单中关闭位置。
对于权限菜单本身,权限切换状态默认为开启,如果:
否则,默认情况下您将看到切换为关闭。
希望对你有帮助。
【讨论】:
根据文档:
安装时授予的有限权限:当用户安装或更新应用程序时,系统会授予该应用程序该应用程序请求的属于 PROTECTION_NORMAL 的所有权限。
所以因为 READ_EXTERNAL_STORAGE 属于 PROTECTION_NORMAL ,它不会触发对话框。
但是由于 WRITE_EXTERNAL_STORAGE 的级别是 PROTECTION_DANGEROUS,它会属于文档中描述的这种行为:
用户在运行时授予权限:当应用程序请求权限时,系统会向用户显示一个对话框,然后调用应用程序的回调函数通知它是否已授予权限。如果用户授予权限,则应用程序将获得该权限功能区域中在应用程序清单中声明的所有权限
这里是保护级别的来源:
【讨论】:
根据Android docs,您不需要请求关于读取和写入外部存储的权限。
编辑:在最新的 Android M 版本中,您需要请求读取和写入权限
【讨论】:
存储权限属于危险保护级别,因此如果App target SDK设置为23,所有危险保护级别权限在Android M安装时不会被授予。它们将在运行时授予。 是的,这些权限也可以在运行时撤销。
没有权限对话框不会被自动触发,你需要通过API请求请求,例如requestPermissions()方法来显示该原生对话框。
请查看危险等级权限列表here
【讨论】: