Java ActivityCompat.requestPermissions不显示对话框

Java ActivityCompat.requestPermissions不显示对话框,java,android,permissions,Java,Android,Permissions,我试图在Nexus5API23上使用这个函数,但它并没有像它应该做的那样显示对话框,它只是什么都没做。 什么会导致问题?(此代码位于java活动中) 我尝试将最小api更改为23,并在没有ActivityCompat的情况下使用requestPermissions(),但仍然无法工作 if (ContextCompat.checkSelfPermission(RegisterActivity.this, Manifest.permission.READ_PHONE_STATE) ==

我试图在Nexus5API23上使用这个函数,但它并没有像它应该做的那样显示对话框,它只是什么都没做。 什么会导致问题?(此代码位于java活动中) 我尝试将最小api更改为23,并在没有ActivityCompat的情况下使用requestPermissions(),但仍然无法工作

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);
以及舱单:

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>
与:


不是
“Manifest.permission.READ\u PHONE\u STATE”
。使用符号
Manifest.permission.READ\u PHONE\u STATE

以下是使用
requestPermissions()
的示例:

首先,在清单中定义权限(正如您在文章中所做的那样),否则,您的请求将自动被拒绝:

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 225);
下面是调用requestPermissions()的代码:

首先,检查您是否已经拥有权限(请记住,即使授予了权限,用户也可以稍后在应用程序设置中撤销该权限。)

最后,这是检查您是否获得许可的方式:

private void showPhoneStatePermission() {
    int permissionCheck = ContextCompat.checkSelfPermission(
            this, Manifest.permission.READ_PHONE_STATE);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.READ_PHONE_STATE)) {
            showExplanation("Permission Needed", "Rationale", Manifest.permission.READ_PHONE_STATE, REQUEST_PERMISSION_PHONE_STATE);
        } else {
            requestPermission(Manifest.permission.READ_PHONE_STATE, REQUEST_PERMISSION_PHONE_STATE);
        }
    } else {
        Toast.makeText(MainActivity.this, "Permission (already) Granted!", Toast.LENGTH_SHORT).show();
    }
}

我也遇到了同样的问题。我更新到buildToolsVersion“23.0.3”它突然起作用了。希望这能帮助任何有此问题的人。

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

我也有同样的问题,结果是由于从依赖项中引入了一个
android:maxSdkVersion
属性

要查看您在APK中请求的实际权限,您可以使用
aapt
工具,如下所示:

@Override
public void onRequestPermissionsResult(
        int requestCode,
        String permissions[],
        int[] grantResults) {
    switch (requestCode) {
        case REQUEST_PERMISSION_PHONE_STATE:
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(MainActivity.this, "Permission Granted!", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "Permission Denied!", Toast.LENGTH_SHORT).show();
            }
    }
}

private void showExplanation(String title,
                             String message,
                             final String permission,
                             final int permissionRequestCode) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(title)
            .setMessage(message)
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    requestPermission(permission, permissionRequestCode);
                }
            });
    builder.create().show();
}

private void requestPermission(String permissionName, int permissionRequestCode) {
    ActivityCompat.requestPermissions(this,
            new String[]{permissionName}, permissionRequestCode);
}
就我而言,它打印了:

/path/to/android-sdk/build-tools/version/aapt d permissions /path/to/your-apk.apk
即使我没有在清单中指定
maxSdkVersion
。我通过将清单中的
更改为:

uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18'


(其中工具名称空间为
http://schemas.android.com/tools

我将我的目标SDK版本从22更新到23,它运行得非常好。

我也遇到了同样的问题,通过将Manifest.permission.READ\u PHONE\u STATE替换为android.Manifest.permission.READ\u PHONE\u STATE解决了这个问题。

对我来说,问题是我的请求代码无效。我选择0xDEADBEEF作为请求代码,但如果我选择255,它会自动失败(可能在内部某个地方被转换为小于32位的代码?),一切都像上面描述的NightSkyDev一样正常。

上述信息很好,但将
targetSdkVersion设置为23(或更高)对于Android来说,将清单中的
标记解释为“我将在代码中询问”而不是“我在安装时要求”是非常关键的。很多资料都会告诉你你需要
标记,但是没有人说为什么,如果你没有设置该值,你会像我一样困惑好几个小时。

这件事刚刚发生在我身上。事实证明,当我需要筛选到危险的权限时,我正在请求所有权限,它突然开始工作

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>

对我来说,错误在清单中:权限是大写的。Android Studio建议我使用大写的权限。我不在乎这个,我花了两个小时来解决这个问题

权限的正确语法是

我需要申请
写入外部存储的权限
,但尽管尝试了所有提到的不同建议,还是没有得到弹出窗口

最终的罪魁祸首是曲棍球。它使用清单合并来包括自己对
写入外部存储的权限
,除非它对其应用了max sdk版本

解决此问题的方法是将其包含在清单文件中,但对其进行替换,以覆盖HockeyApp的版本并获得成功

4.7.2请求外部存储权限(SDK版本5.0.0及更高版本)为Android O准备就绪的其他依赖项, HockeySDK Android 5.0.0及更高版本限制
写入外部存储
maxSdkVersion筛选器的权限。在某些用例中,例如。 如果应用程序包含需要此权限的依赖项, maxSdkVersion使这些依赖项无法授予或删除权限 请求许可。这些情况的解决方案如下:


这将导致其他属性从低到低 优先级清单将被替换,而不是合并


我碰巧在API 23上运行它,我必须使用下面的代码请求权限,就像下面的代码将其放在创建方法上一样。请注意,MY_PERMISSIONS\u REQUEST\u READ\u LOCATION是一个整数,等于1示例int MY_PERMISSIONS\u REQUEST\u READ\u LOCATION=1:

if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.M){ requestPermissions(新字符串[]{Manifest.permission.ACCESS\u rough\u LOCATION},MY\u PERMISSIONS\u REQUEST\u READ\u LOCATION);
}

我在三星S8和N8中遇到了这个问题(在其他任何产品中都没有发现)

因此,问题在于清单文件使用权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/>

这可能不是一行代码的问题

在某些设备上(我不记得是否有Android库存),权限对话框包含一个标记为“不再询问”的复选框。如果在复选框中单击“拒绝”,则不会再次提示您输入该权限,该权限将自动被拒绝给应用程序。要恢复此设置,您必须进入设置->应用->权限,然后重新启用应用程序的该perm。然后关闭它以再次拒绝它。您可能必须在再次关闭应用程序之前打开它,但不确定


我不知道你的Nexus有没有。也许值得一试。

也许这个解决方案可以帮助任何人 而不是:

<uses-permission android:name="android.permission.CAMERA" />
使用:


因此,我们将
android.
添加到
Manifest.permission.WRITE\u EXTERNAL\u STORAGE

对我来说,问题是在发出请求后,我的主要活动立即启动了另一个活动。它取代了对话框,因此
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>
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!)")
    }
}
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/>
<uses-permission android:name="android.permission.CAMERA"
android:requiredFeature="true" />
<uses-permission android:name="android.permission.CAMERA" />
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE " />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <!--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" />


final String requiredPermission = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && targetSdkVersion >= Build.VERSION_CODES.Q) ?
            android.Manifest.permission.ACCESS_FINE_LOCATION :
            android.Manifest.permission.ACCESS_COARSE_LOCATION;
final String requiredPermission = android.Manifest.permission.ACCESS_FINE_LOCATION;
<uses-permission android:name="android.permission.COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />