it-swarm.com.de

ActivityCompat.requestPermissions zeigt kein Dialogfeld an

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);

ich versuche, diese Funktion auf nexus 5 api 23 zu verwenden, und es wird mir nur das Dialogfeld nicht angezeigt, wie es sein soll, es tut einfach nichts. Was könnte das Problem verursachen? (Dieser Code ist in der Java-Aktivität enthalten.) Ich habe versucht, meine Mindest-API auf 23 zu setzen und requestPermissions () ohne ActivityCompat zu verwenden, aber immer noch nicht.

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'
}

und das Manifest:

<?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>
45
Idan Ayzen

Hier ist ein Beispiel für die Verwendung von requestPermissions():

Definieren Sie zunächst die Berechtigung (wie Sie es in Ihrem Posting getan haben) im Manifest. Andernfalls wird Ihre Anfrage automatisch abgelehnt:

<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />

Definieren Sie anschließend in onRequestPermissionsResult () einen Wert für die Behandlung des Berechtigungsrückrufs: 

private final int REQUEST_PERMISSION_PHONE_STATE=1;

Hier ist der Code zum Aufruf von 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();
    }
}

Zunächst prüfen Sie, ob Sie bereits über eine Berechtigung verfügen (denken Sie daran, dass der Benutzer die Berechtigung später auch in den App-Einstellungen widerrufen kann, auch wenn ihm die Berechtigung erteilt wurde) 

Und schließlich prüfen Sie, ob Sie eine Erlaubnis erhalten haben oder nicht:

@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);
}
74
NightSkyDev

Ich hatte das gleiche Problem und es stellte sich heraus, dass das manifest Merger-Tool ein Android:maxSdkVersion-Attribut aus einer Abhängigkeit zieht.

Um die tatsächlich in Ihrem APK angeforderten Berechtigungen anzuzeigen, können Sie das aapt-Tool wie folgt verwenden:

/path/to/Android-sdk/build-tools/version/aapt d permissions /path/to/your-apk.apk

in meinem Fall hat es gedruckt:

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

obwohl ich in meinem Manifest keine maxSdkVersion angegeben hatte. Ich habe dieses Problem behoben, indem ich <uses-permission> in meinem Manifest geändert habe in:

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

(wo der Namespace der Tools http://schemas.Android.com/tools lautet)

29
hrunk

Hoffentlich hilft das anderen.

Ich musste die Erlaubnis für WRITE_EXTERNAL_STORAGE anfordern, bekam jedoch kein Popup, obwohl ich alle genannten Vorschläge ausprobierte.

Der Täter war am Ende HockeyApp. Es verwendet das Manifestmischen von Manifestationen, um seine eigene Berechtigung für WRITE_EXTERNAL_STORAGE aufzunehmen, es sei denn, es wird eine max-sdk-Version angewendet.

Sie können dieses Problem umgehen, indem Sie es in Ihre Manifest-Datei aufnehmen, jedoch mit einem Ersetzen dagegen, um die HockeyApp-Version und den Erfolg außer Kraft zu setzen!

4.7.2 Andere Abhängigkeiten, die die Berechtigung zum externen Speicher anfordern (SDK-Version 5.0.0 und höher) Bereit für Android O, HockeySDK-Android 5.0.0 und höher begrenzen den WRITE_EXTERNAL_STORAGE Erlaubnis mit dem Filter maxSdkVersion. In einigen Anwendungsfällen, z.B. Wenn eine App eine Abhängigkeit enthält, für die diese Berechtigung erforderlich ist, maxSdkVersion macht es diesen Abhängigkeiten unmöglich, oder .__ zu gewähren. Bitte um Erlaubnis. Die Lösung für diese Fälle lautet wie folgt:

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

Dies führt dazu, dass andere Attribute von low Prioritätslisten werden ersetzt, anstatt zusammengeführt zu werden.

https://support.hockeyapp.net/kb/client-integration-Android/hockeyapp-for-Android-sdk#permissions-advanced

18
Talha

Ersetzen:

ActivityCompat.requestPermissions(this, new String[]{"Manifest.permission.READ_PHONE_STATE"}, 225);

mit:

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 225);

Die tatsächliche Zeichenfolge für diese Berechtigung ist nicht "Manifest.permission.READ_PHONE_STATE". Verwenden Sie das Symbol Manifest.permission.READ_PHONE_STATE.

8
CommonsWare

Ich habe meine Ziel-SDK-Version von 22 auf 23 aktualisiert.

4
Shyam Sunder

Es könnte kein Problem mit einer einzelnen Codezeile sein.

Bei einigen Geräten (ich kann mich nicht erinnern, ob Android auf Lager ist) enthält der Berechtigungsdialog ein Kontrollkästchen mit der Aufschrift "Nie wieder fragen". Wenn Sie mit dem Kontrollkästchen auf Verweigern klicken, werden Sie nicht erneut zur Eingabe dieser Berechtigung aufgefordert, sondern der App wird dies automatisch verweigert. Um dies zu respektieren, müssen Sie in Einstellungen -> App -> Berechtigungen gehen und diese Berechtigung für die App erneut aktivieren. Schalten Sie es dann aus, um es erneut zu verweigern. Möglicherweise müssen Sie die App öffnen, bevor Sie sie wieder ausschalten.

Ich weiß nicht, ob dein Nexus es hat. Vielleicht einen Versuch wert.

2
androidguy

Für mich bestand das Problem darin, versehentlich eine Gruppe anstelle der tatsächlichen Berechtigungen anzufordern.

1
Meanman

Ich hatte das gleiche Problem und löste es, indem ich Manifest.permission.READ_PHONE_STATE durch Android.Manifest.permission.READ_PHONE_STATE ersetzte.

1
Beaux

Das ist mir gerade passiert. Es stellte sich heraus, dass ich ALLE Berechtigungen anforderte, als ich nur nach GEFÄHRLICHEN Berechtigungen filtern musste, und es begann plötzlich zu funktionieren.

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!)")
    }
}
1
Benjamin H

Die obigen Informationen sind gut, aber die Einstellung targetSdkVersion auf 23 (oder höher) ist critical für Android, um den <uses-permission>-Tag im Manifest als "Ich werde im Code fragen" anstelle von "Ich fordere die Installation" zu interpretieren. Viele Quellen werden Ihnen sagen, dass Sie das <uses-permission>-Tag benötigen, aber niemand sagt, warum und wenn Sie diesen Wert nicht festgelegt haben, werden Sie stundenlang genauso verwirrt sein wie ich.

0
Eliot Gillum

es ist mir passiert, dass ich es auf API 23 ausführte, und ich musste den Code verwenden, um eine Erlaubnis anzufordern, wie der folgende Code es auf Create-Methode setzt. Beachten Sie, dass MY_PERMISSIONS_REQUEST_READ_LOCATION eine Ganzzahl ist, die 1 Beispiel entspricht. int MY_PERMISSIONS_REQUEST_READ_LOCATION = 1:

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

0
Jair Martinez

Vielleicht kann diese Lösung jedem helfen.

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

benutzen :

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

so fügen wir Android. zu Manifest.permission.WRITE_EXTERNAL_STORAGE hinzu

0
user10955646

Für mich bestand das Problem darin, dass ich einen ungültigen Anforderungscode hatte. Ich wähle 0xDEADBEEF als Anforderungscode, und er ist im Stillen fehlgeschlagen (möglicherweise ist er irgendwo intern kleiner als 32-Bit?).

0
griffin2000

Für mich bestand das Problem darin, dass meine Haupttätigkeit unmittelbar nach der Beantragung eine andere Tätigkeit auslöste. Das ersetzte den Dialog und wurde nie gesehen.

0
JohnT

Für mich lag der Fehler im Manifest: Die Erlaubnis war in Großbuchstaben. Android Studio schlägt mir die Berechtigungen in Großbuchstaben vor. Das interessiert mich nicht und ich habe zwei Stunden gebraucht, um dieses Problem zu beheben.

Die richtige Syntax für die Erlaubnis ist 
<uses-permission Android: name = "Android.permission.WRITE_EXTERNAL_STORAGE" />

0
AlainPre

Ich hatte das gleiche Problem. Ich habe ein Update auf buildToolsVersion "23.0.3" Es hat plötzlich funktioniert. Ich hoffe, das hilft jedem, der dieses Problem hat.

0
Bk245

Ich bin auf dieses Problem in Samsung S8 und N8 gestoßen (wurde in keinem anderen gefunden)

das Problem liegt also in der Manifest-Datei use-permission

<uses-permission Android:name="Android.permission.CAMERA"
Android:requiredFeature="true" />

Aus irgendeinem Grund ist das Attribut Android:requiredFeature der Täter. und ich habe die Erklärung nicht gefunden, warum.

zu lösen, einfach entfernen,

<uses-permission Android:name="Android.permission.CAMERA" />
0
grandia