Android M 权限对话框未显示
Android M permission dialog not showing
我目前正在尝试使我的应用程序适应 Android M 的新权限模型。
我正在收集我需要的所有权限,然后 运行
Log.i("Permissions", "Requesting permissions: " + permissions);
requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), requestCodeForPermissions);
requiredPermissions 拥有我需要的权限,如 android.permission.WRITE_EXTERNAL_STORAGE
。
该例程肯定会执行,因为我在 logcat:
中有日志行
08-07 12:52:46.469: I/Permissions(1674): Requesting permissions: android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE
但是权限对话框从未显示,更不用说调用 onRequestPermissionsResult() 了。
我做错了什么?根据一些教程,我发现我没有遗漏任何东西。
我只有用于测试的模拟器,没有物理设备。这是设置中的关于屏幕:
Image
可能值得一提的是:如果我尝试从主屏幕打开已安装应用程序的概览,我只会看到 launcher3 has exited
。我不确定这是否相关。
有人知道为什么它没有显示吗?
搜索一段时间后,似乎需要将值 compileSdkVersion 设置为 "android-MNC" 或截至今天设置为 23。这需要 Gradle 构建系统,然后似乎需要 Android 工作室。
至少我找不到关于如何在 gradle 文件之外设置它的手册。
我也遇到过使用 <uses-permission-sdk23>
元素时权限对话框不出现或应用程序崩溃的情况,但原因似乎是当前 6.0 设备上的系统错误:
https://code.google.com/p/android/issues/detail?id=189841
崩溃异常:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity}: java.lang.NullPointerException: Attempt to get length of null array
我遇到了同样的问题,但后来我意识到我忘记为清单文件添加权限。添加uses-permission标签后,系统显示对话框。也许可以帮助某人。
我遇到了同样的问题,因为我使用负值作为 REQUEST_CODE。
requestPermissions(new String[]{android.Manifest.permission.CAMERA}, -1)
使用正值后,系统显示对话框。
希望对大家有帮助。
添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在AndroidManifest.xml
注意:您想要获得的权限。例如:android.permission.ACCESS_FINE_LOCATION等
我做了上面答案中所说的所有事情,但仍然没有显示对话框,然后我在 gradle 中将 targetSdkVersion
更改为 23
,它出现了。希望这对某人有帮助
我有同样的问题,添加 shouldShowRequestPermissionRationale 后问题解决了,如下所示:
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
} else {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
权限被组织成类别,因此在不显示对话框的情况下授予非关键权限。
我发现这对 Internet 权限很困难,如果您遇到此问题,则更改为 read_contacts 等关键权限将允许您测试您的流程并揭示问题是否出在权限上是非关键的或其他的。
Normal protection permissions are listed here
我刚遇到同样的问题。
我的问题是我在清单中的错误位置写了权限。
确保使用权限在应用程序之外:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.google.android.gms.samples.vision.face.photo"
android:installLocation="auto"
android:versionCode="1"
android:versionName="1" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:hardwareAccelerated="true"
android:label="FacePhotoDemo"
android:allowBackup="true"
android:icon="@drawable/icon">
@Override
public final void validateRequestPermissionsRequestCode(int requestCode) {
// We use 16 bits of the request code to encode the fragment id when
// requesting permissions from a fragment. Hence, requestPermissions()
// should validate the code against that but we cannot override it as we
// can not then call super and also the ActivityCompat would call back to
// this override. To handle this we use dependency inversion where we are
// the validator of request codes when requesting permissions in
// ActivityCompat.
if (!mRequestedPermissionsFromFragment
&& requestCode != -1 && (requestCode & 0xffff0000) != 0) {
throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
}
}
有同样的问题。后来我意识到我们必须在清单中声明每一个权限(即使一个是另一个的子类)。
就我而言,我声明
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
在我的清单中并试图访问用户的粗略位置。
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
通过在清单中添加粗略权限解决了问题。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
在清单中,我更改了
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="22" />
至
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
也许这有帮助。
也在清单文件中添加权限。
要添加到@shanraisshan 的回答中,REQUEST_CODE
实际上必须大于 0,而不仅仅是非负数。
将您的 targetSdkVersion 设置为 22.
有同样的(我猜)问题,解决方案是删除
import <app package>.Manifest;
由文件顶部的 Android Studio 自动导入,并将其替换为
import android.Manifest;
并开始工作
在我的例子中,解决方案是字符串本身
android.permission.READ_CONTACTS
我做了 Manifest.permission.READ_CONTACTS 导致静音错误(屏幕上没有显示)。
确保这是正确的
根据 Hilal 的评论(非常感谢!):
在我的例子中,我的应用程序确实使用了 tabhost,并且从 tabhost 中的 Activity 请求了权限。在启动一个单独的 activity 请求权限后,它正在工作。
在我们的代码中,这是一个简单的拼写错误。
我们有:
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" />
应该是:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
如果你们中有人有 changes/modifies WRITE_SETTINGS
的应用程序并且遇到了这个问题。查看
我面临这个问题 2 周,后来意识到这个问题是由于 requestPermissions
无法请求 WRITE_SETTINGS
权限。
希望这有帮助 :D
在我的例子中,我在清单文件中请求了 "ACCESS_COARSE_LOCATION",然后在代码中请求了 "ACCESS_FINE_LOCATION" 权限,这就是权限对话框未打开的原因。
我对 requestPermissions() 进行了两次调用,一个接一个。此错误消息出现在 Logcat 中(注意 "request" 中的拼写错误):
Can reqeust only one set of permissions at a time
requestPermissions() 实际上被设计为一次接受多个请求;这就是 String 数组的用途。
将最终常量值更改为 1。
private static final int REQUEST_PERMISSION_WRITE = 1;
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);
我花了一整天的时间才找出导致问题的原因。 帮助了我。
我通过像这样添加 tools:remove="android:maxSdkVersion"
来修复:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>
就我而言,我请求的权限 (WRITE_SETTINGS) 更为特殊,需要设置 Activity 才能启动。所以对话没有出现。
我必须使用以下代码获得其许可:
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);
请求危险权限时无法显示权限对话框的另一个原因...
我必须执行 Build -> Clean Project 然后 Build -> Rebuild Project。我想 Android Studio 没有注意到我在清单中所做的更改。
由于清单中权限常量的大小写错误导致我遇到了类似的问题,我使用的是小写的 read_contacts
:
<uses-permission android:name="android.permission.read_contacts" />
将 read_contacts
更改为大写后,它开始按预期工作
<uses-permission android:name="android.permission.READ_CONTACTS" />
我的 Android targetSDK 版本是 28.
我没有看到 android Manifest.xml 中列出的任何向请求权限的用户显示的弹出窗口。
在这两个安装过程中,使用 USB 安装 .apk 并从 google Play 商店安装应用程序。
所以我在 activity 中添加了以下代码,它会在运行时
请求用户许可
ActivityCompat.requestPermissions(MyActivity.this,
新字符串[]{Manifest.permission.READ_PHONE_STATE}, 1);
我正在通过代码请求权限,但没有在清单中添加 <uses-permission ..>
标签!
我目前正在尝试使我的应用程序适应 Android M 的新权限模型。
我正在收集我需要的所有权限,然后 运行
Log.i("Permissions", "Requesting permissions: " + permissions);
requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), requestCodeForPermissions);
requiredPermissions 拥有我需要的权限,如 android.permission.WRITE_EXTERNAL_STORAGE
。
该例程肯定会执行,因为我在 logcat:
中有日志行08-07 12:52:46.469: I/Permissions(1674): Requesting permissions: android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE
但是权限对话框从未显示,更不用说调用 onRequestPermissionsResult() 了。
我做错了什么?根据一些教程,我发现我没有遗漏任何东西。 我只有用于测试的模拟器,没有物理设备。这是设置中的关于屏幕: Image
可能值得一提的是:如果我尝试从主屏幕打开已安装应用程序的概览,我只会看到 launcher3 has exited
。我不确定这是否相关。
有人知道为什么它没有显示吗?
搜索一段时间后,似乎需要将值 compileSdkVersion 设置为 "android-MNC" 或截至今天设置为 23。这需要 Gradle 构建系统,然后似乎需要 Android 工作室。 至少我找不到关于如何在 gradle 文件之外设置它的手册。
我也遇到过使用 <uses-permission-sdk23>
元素时权限对话框不出现或应用程序崩溃的情况,但原因似乎是当前 6.0 设备上的系统错误:
https://code.google.com/p/android/issues/detail?id=189841
崩溃异常:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity}: java.lang.NullPointerException: Attempt to get length of null array
我遇到了同样的问题,但后来我意识到我忘记为清单文件添加权限。添加uses-permission标签后,系统显示对话框。也许可以帮助某人。
我遇到了同样的问题,因为我使用负值作为 REQUEST_CODE。
requestPermissions(new String[]{android.Manifest.permission.CAMERA}, -1)
使用正值后,系统显示对话框。 希望对大家有帮助。
添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在AndroidManifest.xml
注意:您想要获得的权限。例如:android.permission.ACCESS_FINE_LOCATION等
我做了上面答案中所说的所有事情,但仍然没有显示对话框,然后我在 gradle 中将 targetSdkVersion
更改为 23
,它出现了。希望这对某人有帮助
我有同样的问题,添加 shouldShowRequestPermissionRationale 后问题解决了,如下所示:
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
} else {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
权限被组织成类别,因此在不显示对话框的情况下授予非关键权限。
我发现这对 Internet 权限很困难,如果您遇到此问题,则更改为 read_contacts 等关键权限将允许您测试您的流程并揭示问题是否出在权限上是非关键的或其他的。
Normal protection permissions are listed here
我刚遇到同样的问题。 我的问题是我在清单中的错误位置写了权限。 确保使用权限在应用程序之外:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.google.android.gms.samples.vision.face.photo"
android:installLocation="auto"
android:versionCode="1"
android:versionName="1" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:hardwareAccelerated="true"
android:label="FacePhotoDemo"
android:allowBackup="true"
android:icon="@drawable/icon">
@Override
public final void validateRequestPermissionsRequestCode(int requestCode) {
// We use 16 bits of the request code to encode the fragment id when
// requesting permissions from a fragment. Hence, requestPermissions()
// should validate the code against that but we cannot override it as we
// can not then call super and also the ActivityCompat would call back to
// this override. To handle this we use dependency inversion where we are
// the validator of request codes when requesting permissions in
// ActivityCompat.
if (!mRequestedPermissionsFromFragment
&& requestCode != -1 && (requestCode & 0xffff0000) != 0) {
throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
}
}
有同样的问题。后来我意识到我们必须在清单中声明每一个权限(即使一个是另一个的子类)。 就我而言,我声明
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
在我的清单中并试图访问用户的粗略位置。
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
通过在清单中添加粗略权限解决了问题。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
在清单中,我更改了
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="22" />
至
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
也许这有帮助。
也在清单文件中添加权限。
要添加到@shanraisshan 的回答中,REQUEST_CODE
实际上必须大于 0,而不仅仅是非负数。
将您的 targetSdkVersion 设置为 22.
有同样的(我猜)问题,解决方案是删除
import <app package>.Manifest;
由文件顶部的 Android Studio 自动导入,并将其替换为
import android.Manifest;
并开始工作
在我的例子中,解决方案是字符串本身
android.permission.READ_CONTACTS
我做了 Manifest.permission.READ_CONTACTS 导致静音错误(屏幕上没有显示)。
确保这是正确的
根据 Hilal 的评论(非常感谢!): 在我的例子中,我的应用程序确实使用了 tabhost,并且从 tabhost 中的 Activity 请求了权限。在启动一个单独的 activity 请求权限后,它正在工作。
在我们的代码中,这是一个简单的拼写错误。
我们有:
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" />
应该是:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
如果你们中有人有 changes/modifies WRITE_SETTINGS
的应用程序并且遇到了这个问题。查看
我面临这个问题 2 周,后来意识到这个问题是由于 requestPermissions
无法请求 WRITE_SETTINGS
权限。
希望这有帮助 :D
在我的例子中,我在清单文件中请求了 "ACCESS_COARSE_LOCATION",然后在代码中请求了 "ACCESS_FINE_LOCATION" 权限,这就是权限对话框未打开的原因。
我对 requestPermissions() 进行了两次调用,一个接一个。此错误消息出现在 Logcat 中(注意 "request" 中的拼写错误):
Can reqeust only one set of permissions at a time
requestPermissions() 实际上被设计为一次接受多个请求;这就是 String 数组的用途。
将最终常量值更改为 1。
private static final int REQUEST_PERMISSION_WRITE = 1;
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);
我花了一整天的时间才找出导致问题的原因。
我通过像这样添加 tools:remove="android:maxSdkVersion"
来修复:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>
就我而言,我请求的权限 (WRITE_SETTINGS) 更为特殊,需要设置 Activity 才能启动。所以对话没有出现。
我必须使用以下代码获得其许可:
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);
请求危险权限时无法显示权限对话框的另一个原因...
我必须执行 Build -> Clean Project 然后 Build -> Rebuild Project。我想 Android Studio 没有注意到我在清单中所做的更改。
由于清单中权限常量的大小写错误导致我遇到了类似的问题,我使用的是小写的 read_contacts
:
<uses-permission android:name="android.permission.read_contacts" />
将 read_contacts
更改为大写后,它开始按预期工作
<uses-permission android:name="android.permission.READ_CONTACTS" />
我的 Android targetSDK 版本是 28.
我没有看到 android Manifest.xml 中列出的任何向请求权限的用户显示的弹出窗口。 在这两个安装过程中,使用 USB 安装 .apk 并从 google Play 商店安装应用程序。 所以我在 activity 中添加了以下代码,它会在运行时
请求用户许可ActivityCompat.requestPermissions(MyActivity.this, 新字符串[]{Manifest.permission.READ_PHONE_STATE}, 1);
我正在通过代码请求权限,但没有在清单中添加 <uses-permission ..>
标签!