1

Ich versuche, das Ergebnis einer Anfrage Permissions (..) mithilfe einer Schlafschleife zu erhalten und auf Benutzerantwort warten, aber die Callback-Methode onRequestPermissionsResult (..) muss auf die Methode warten welche Call RequestPermissions beendet werden, um auszuführen, so kann ich es auch nicht bekommen.onRequestPermissionsResult Callback muss warten Methodenaufruf requestPermissions zu beenden

Beispielcode:

public int result = 0; 

public int askSystemForPermission(String permission) 
{ 
    result = 0; 
    requestPermissions(this,new String[] {permission}); 

    while (result == 0)     // It hang forever here 
    {         // because onRequestPermissionsResult never excute 
     try {        // then result always equals to 0 
      Thread.sleep(500); 
     } catch (Exception ecx) {} 
    } 

    return result; 
} 


public void onRequestPermissionsResult(...) 
{ 
    if (/*granted*/) 
    { 
     result = 1; 
    } 
    else if (/*dont show again*/) 
    { 
     result = 2; 
    } 
    else //denied 
    { 
     result = 3; 
    } 
} 

ich eine Lösung habe versucht: Put requestPermissions in neuen Thread(), runOnUiThread() .. immer noch die gleichen. Call RequestPermissions von anderen Activity, die neue Activity nicht starten, noch warten askSystemForPermission Methode zu beenden.

P/S: Es kann auf andere Weise getan werden, aber ich möchte wissen, warum Android so handeln und wie Sie dieses Problem lösen.

+0

ich das gleiche Problem gestoßen. aber wenn ich den Thread von C++ (ndk) erstelle, ist es ok. – user558185

Antwort

0

Requesting permissions ist eine asynchrone Aufgabe, Ihr unsynchronisierten Ergebnis Variable 0 immer für immer sein wird, weil der Rest des Codes in diesem Verfahren und die Anforderung Rückruf in verschiedenen Threads passieren (man denkt alternative Zeitlinien).

Was Sie tun müssen, ist zunächst zu überprüfen, ob Sie bereits die Berechtigung

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { 
    ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); 
} 

Wenn Sie dann nicht tun Sie bitte um die Erlaubnis, aber Sie warten, bis es durch eine andere Methode überschrieben und tun, um Ihre von dort aus arbeiten:

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) 

Dies gilt natürlich auch bedeuten, dass Ihre Methode nicht Ergebnis zurückgeben kann - man kann nicht etwas asynchron und haben Ihre Methode für das Blockieren eines thr warten laufen ead (also nicht zur Verfügung, den Thread verläßt sogar für einen Rückruf)

(Hinweis: MY_PERMISSIONS_REQUEST_READ_CONTACTS ist ein selbst definierte Anforderungscode)

Verwandte Themen