4

Ich versuche, ACCESS_FINE_LOCATION Berechtigungen anfordern, um den aktuellen Standort des Benutzers zu erhalten.ActivityCompat.requestPermissions zeigt keine Eingabeaufforderung

Meine Protokollierung zeigt an, dass meine App diese Berechtigung derzeit nicht hat, wenn sie ContextCompat.checkSelfPermission() abfragt, aber wenn ActivityCompat.requestPermissions() aufgerufen wird, wird nichts angezeigt.

Mein Google-Kartencode (Implementierung OnMapReadyCallback und ActivityCompat.OnRequestPermissionsResultCallback()) ist in einem FragmentActivity.

Ich habe es geschafft, die requestPermissions() Funktion funktioniert erfolgreich in anderen Aktivitäten in der App, es ist nur die mit der Google-Karte. Es funktioniert nicht, wenn es in der onCreate() Methode der Activity oder in onMapReady() platziert wird (wo es gehen muss).

if(ContextCompat.checkSelfPermission(LocationActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     Log.d(TAG, "not granted"); 
     final String[] permissions = new String[] {android.Manifest.permission.ACCESS_FINE_LOCATION}; 
    if(ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.ACCESS_FINE_LOCATION)) { 
      Log.d(TAG, "rationale"); 
      // Explain to the user why permission is required, then request again 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setMessage("We need permissions") 
        .setCancelable(false) 
        .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          ActivityCompat.requestPermissions(LocationActivity.this, permissions, 1); 
        } 
       }); 
     AlertDialog alert = builder.create(); 
     alert.show(); 

    } else { 
     Log.d(TAG, "request" + android.Manifest.permission.ACCESS_FINE_LOCATION); 
     // If permission has not been denied before, request the permission 
     ActivityCompat.requestPermissions(LocationActivity.this, permissions, 1); 
    } 
} else { 
    Log.d(TAG, "granted"); 
} 

Irgendwelche Ideen? Hat es etwas mit der Klasse meiner Aktivität zu tun (FragmentActivity), oder ist es möglich, dass die Google Map die Berechtigungsanforderung asynchron aufruft?

+0

Ich bin überrascht, dass dies kompiliert. 'checkSelfPermission()' verwendet 'LocationActivity.this'. Die zweite 'requestPermissions()' verwendet 'PermissionsRequestActivity.this'. – CommonsWare

+0

Entschuldigung ja, ich musste meinen Code leicht ändern für die Veröffentlichung, der zweite sollte sein LocationActivity.this – Robin

+0

Ich hatte versucht, alle requestPermissions in einer separaten Aktivität, aber das macht den Rückruf schwierig, und ist hacky. – Robin

Antwort

8

Nachdem ich meine Klasse komplett ausgepackt habe, und es immer noch nicht funktioniert, habe ich festgestellt, dass diese Aktivität mit einem TabHost instanziiert wird.

Wenn ich den TabHost nicht mehr benutze, wird die Eingabeaufforderung erfolgreich angezeigt. Ich nehme an, dass TabHosts nicht von den neuen Eingabeaufforderungen unterstützt werden - ist das ein Fehler?

gleiches Problem wie App requests aren't showing up

ich ein PermissionsRequestActivity Schaffung endete, die die Erlaubnis-Anfrage und Antwort im Namen meiner TabHost behandelt, dann verläßt (in den gewünschte Erlaubnis Informationen gehen durch die Intent Extras Bundle).
Es übergibt die Antwort auf die Anfrage als Broadcast, die von meinem TabHost abgeholt wird.

Bisschen Hack aber funktioniert OK!

+0

Ja! Hier gilt das gleiche. – Hilal

+0

Dito - mit TabHost und es zeigt auch nicht für mich. Wer kann damit umgehen? – AlexVPerl

+0

Ich habe am Ende eine PermissionsRequestActivity erstellt, die die Erlaubnisanforderung und -antwort im Auftrag meines TabHosts bearbeitet und dann beendet wird (die angeforderten Berechtigungsinformationen über das Intents-Extras-Bundle weiterleiten). Es gibt die Antwort auf die Anfrage als Broadcast zurück, die von meinem TabHost abgeholt wird. Bisschen Hack aber funktioniert OK! – Robin

0

Überprüfen Sie, ob Sie die angeforderte Berechtigung in der Manifestdatei von Android bereits vor Android M hinzugefügt haben. Nur dann erhalten Sie das erwartete Verhalten.

die Erlaubnis zu Ihrem Manifest hinzufügen, so dass Sie es über ActivityCompat.requestPermissions anfordern können:

<uses-permission android:name="android.permission. ACCESS_FINE_LOCATION" /> 
+0

Danke, ich hatte das; An anderer Stelle in der App wurde die Berechtigungsanfrage erfolgreich angezeigt. Ich habe die Ursache gefunden, sehe meine Antwort oben. – Robin

0

Ich werde den Code teilen, die für mich funktioniert. Im geschützten Hohlraum onCreate (Bundle savedInstanceState) {} Methode meiner Tätigkeit, wo ich die Eingabeaufforderung sehen will, muss ich diesen Code enthalten:

/* Check whether the app has the ACCESS_FINE_LOCATION permission and whether the app op that corresponds to 
    * this permission is allowed. The return value is an int: The permission check result which is either 
    * PERMISSION_GRANTED or PERMISSION_DENIED or PERMISSION_DENIED_APP_OP. 
    * Source: https://developer.android.com/reference/android/support/v4/content/PermissionChecker.html 
    * While testing, the return value is -1 when the "Your location" permission for the App is OFF, and 1 when it is ON. 
    */ 
    int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); 
    // The "Your location" permission for the App is OFF. 
    if (permissionCheck == -1){ 
     /* This message will appear: "Allow [Name of my App] to access this device's location?" 
     * "[Name of my Activity]._instance" is the activity. 
     */ 
     ActivityCompat.requestPermissions([Name of my Activity]._instance, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_ACCESS_FINE_LOCATION); 
    }else{ 
     // The "Your location" permission for the App is ON. 
     if (permissionCheck == 0){ 
     } 
    } 

Vor dem protected void onCreate (Bundle savedInstanceState) {} Methode, habe ich die folgende Konstante und Methode:

public static final int REQUEST_CODE_ACCESS_FINE_LOCATION = 1; // For implementation of permission requests for Android 6.0 with API Level 23. 

// Code from "Handle the permissions request response" at https://developer.android.com/training/permissions/requesting.html. 
@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CODE_ACCESS_FINE_LOCATION: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // location-related task you need to do.     

      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 
0

Ich habe das gleiche Problem auf einem Projekt, das TabHost verwenden. Basis auf @Robin-Lösung, verwende ich die EventBus-Bibliothek zum Senden einer Nachricht von untergeordneten Aktivitäten an die TabActity.

EventBus: https://github.com/greenrobot/EventBus

ein Ereignisobjekt erstellen:

public class MessageEvent { 
    private String message; 
    public MessageEvent(String message){ 
     this.message = message; 
    } 

    public String getMessage(){ 
     return this.message; 
    } 
} 

In Ihrer Haupttätigkeit:

private EventBus eventBus = EventBus.getDefault(); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    eventBus.register(this); 
} 
@Override 
protected void onDestroy() { 
    eventBus.unregister(this); 
    super.onDestroy(); 
} 
@Subscribe(threadMode = ThreadMode.MAIN) 
public void onMessageEvent(MessageEvent event) { 
    if (event.getMessage().equals("contacts")){ 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(android.Manifest.permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(MainPage.this,new String[]{android.Manifest.permission.WRITE_CONTACTS}, 100); 
     } 
    } 
}; 

eine andere Nachricht für die Erlaubnis Stellen Sie Ihren Mangel zu beantragen. In Ihrem Kind Aktivität können Sie als die passende Nachricht hinterlassen:

EventBus.getDefault().post(new MessageEvent("contacts")); 

bewusst sein onRequestPermissionsResult Rückruf und den Anforderungscode;)! Es wird nur in der Hauptaktivität funktionieren.