ActivityCompat.requestPermissions不显示对话框框。

113
if (ContextCompat.checkSelfPermission(RegisterActivity.this,      Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_DENIED){
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE_PERMISSION);

我正在尝试在Nexus 5上的API 23上使用此函数,但它并没有像它应该做的那样显示对话框,什么也没发生。 可能是什么原因导致这个问题?(此代码在Java活动中) 我尝试将我的最小API更改为23,并使用requestPermissions()而不是ActivityCompat,但仍然无法解决。

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
    applicationId "com.example.idanayzen.photomap"
    minSdkVersion 23
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.google.android.gms:play-services:8.4.0'
compile 'com.android.support:design:23.1.1'
}

并且清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.idanayzen.photomap">

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">


    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/google_maps_key" />

    <activity
        android:name=".MapsActivity"
        android:label="@string/title_activity_maps" />
    <activity android:name=".RegisterActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".WrongPhoneNum"></activity>
</application>

</manifest>

顺便说一下,我已经尝试将字符串更改为“android.permission.READ_PHONE_STATE”,但仍然相同。 - Idan Ayzen
权限被阻止了吗? - K.Sopheak
24个回答

2
我按照最佳答案的方法尝试,但仍然无法解决问题。这个简单的问题浪费了我很多时间。在我的情况下,我正在尝试获取 MANAGE_EXTERNAL_STORAGE 的访问权限。最终,我发现对于这个特定的权限,我们不能使用 ActivityCompat.requestPermissions(),而是必须使用 Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION。并且要检查权限是否存在,我们还需要使用不同的 API:Environment.isExternalStorageManager() 而不是 ContextCompat.checkSelfPermission(),不确定为什么他们设计成如此不一致的方式,导致了这么多的困惑。
我通过遵循以下步骤解决了我的问题:如何获得 MANAGE_EXTERNAL_STORAGE 权限 同时,在SDK文档中也提到了这一点:管理所有文件

救命稻草.. 没有人会告诉你事情比看起来更糟 :) - abby

2

无论你做什么,都要检查在Manifest文件中是否声明了所需的权限。


    <!--Declaring the required permissions-->
    <uses-permission
        android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission
        android:name="android.permission.CAMERA" />



然后继续下一步操作...

1
对我来说问题是错误地请求了一个组,而不是实际的权限。

1
上述信息很好,但将targetSdkVersion设置为23(或更高版本)对于Android解释清单中的<uses-permission>标签是“我将在代码中请求”而不是“我要求安装”是至关重要的。许多来源会告诉您需要<uses-permission>标签,但没有人说明原因,如果您没有设置该值,您将像我一样困惑数小时。

1
我在三星S8和N8中遇到了这个问题(在其他设备上没有发现),问题出在清单文件中的uses-permission。
<uses-permission android:name="android.permission.CAMERA"
android:requiredFeature="true" />

由于某些原因,属性android:requiredFeature是罪魁祸首。我还没有找到解释为什么的说明。
要解决问题,只需简单地将其删除即可。
<uses-permission android:name="android.permission.CAMERA" />

0

我也遇到了同样的问题。我将 buildToolsVersion“23.0.3” 更新后,问题突然就解决了。希望这能帮助到遇到同样问题的人。


0
对我来说,问题在于我有一个无效的请求代码。 我选择0xDEADBEEF作为请求代码,但它默默失败了(也许在内部的某个地方将其转换为小于32位的东西了?) 如果我选择255,一切都像NightSkyDev上面描述的那样正常工作。

2
文档指出,requestCode应该≥0。0xDEADBEEF < 0。 - Fls'Zen

0
我曾经遇到过同样的问题,后来通过将Manifest.permission.READ_PHONE_STATE替换为android.Manifest.permission.READ_PHONE_STATE解决了它。

0

0
对我来说,错误在清单文件中:权限是大写的。Android Studio建议我使用大写字母的权限。我不在意这个问题,花了我两个小时才解决了这个问题。
权限的正确语法是: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接