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个回答

0
对我来说,问题是在请求之后,我的主要活动启动了另一个活动。这超越了对话框,因此它从未被看到。

嗨,伙计,我认为这是我的问题,你解决了吗? - Jose Ricardo Citerio Alcala
只需更改应用程序中的事件流程。在请求权限后不要立即启动另一个活动! - JohnT

0

这种情况刚刚发生在我身上。结果发现我请求了所有权限,但实际上只需要过滤出危险权限,然后它就突然开始工作了。

fun requestPermissions() {
    val missingDangerPermissions = PERMISSIONS
            .filter { ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED }
            .filter { this.getPackageManager().getPermissionInfo(it, PackageManager.GET_META_DATA).protectionLevel == PermissionInfo.PROTECTION_DANGEROUS } // THIS FILTER HERE!

    if (missingDangerPermissions.isNotEmpty()) {
        Log.i(TAG, "Requesting dangerous permission to $missingDangerPermissions.")
        ActivityCompat.requestPermissions(this,
                missingDangerPermissions.toTypedArray(),
                REQUEST_CODE_REQUIRED_PERMISSIONS);
        return
    } else {
        Log.i(TAG, "We had all the permissions we needed (yay!)")
    }
}

你从哪里获取ContextCompat的变量?我尝试了但找不到变量,结果怎样? - gumuruh

-1

我曾经遇到过这个问题,当时我在API 23上运行代码,必须像下面这样使用请求权限的代码,将它放在on create方法中。请注意,MY_PERMISSIONS_REQUEST_READ_LOCATION是一个整数,例如int MY_PERMISSIONS_REQUEST_READ_LOCATION = 1:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{ Manifest.permission.ACCESS_COARSE_LOCATION},MY_PERMISSIONS_REQUEST_READ_LOCATION); }


-4
也许这个解决方案可以帮助其他人,而不是:
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);

使用:

ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);

所以我们需要在Manifest.permission.WRITE_EXTERNAL_STORAGE前面加上android.


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