it-swarm.com.de

onRequestPermissionsResult wird nicht in Fragment aufgerufen, wenn es in Fragment und Aktivität definiert ist

Ich habe ein Fragment, in dem ich die Recycling- und Einstellungsdaten in diesem Recycling-Übersichtsfenster mit dem Recycling-Übersichtsadapter habe.

Jetzt habe ich eine Schaltfläche in der Liste des Adapters, auf die geklickt wird, auf die ich die Berechtigung READ_EXTERNAL_STORAGE in Android überprüfen muss, um ein neues Berechtigungsmodell in Android zu erhalten. 

Ich habe eine neue Funktion im Fragment dieses Adapters erstellt, um zu prüfen, ob die Berechtigung erteilt wurde oder nicht, und um Erlaubnis zu bitten, falls dies nicht bereits erfolgt ist.

Ich habe MyFragment.this als Parameter im Adapter übergeben und die Methode des Fragments über den Button click in adapter aufgerufen.

Ich habe den folgenden Code verwendet, um requestPermission in fragment aufzurufen.

if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED)){
       requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                ConstantVariables.READ_EXTERNAL_STORAGE);
    }

Ich habe die onRequestPermissionsResult-Methode in Fragment mit dem folgenden Code überschrieben:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case ConstantVariables.READ_EXTERNAL_STORAGE:
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, proceed to the normal flow.
                startImageUploading();
            } else {}

Es wird jedoch nicht aufgerufen, statt dessen wird die onRequestPermissionsResult-Methode dieser Aktivität aufgerufen. 

Ich habe dieselbe onRequestPermissionsResult-Methode auch in der übergeordneten Aktivität von Fragment definiert, und es wird aufgerufen.

Ich kann die onRequestPermissionsResult-Methode der Aktivität nicht entfernen, möchte jedoch die onRequestPermissionsResult-Methode von fragment aufrufen, wenn ich die Erlaubnis von fragment ..__ beantrage. Wie kann ich das tun? Mache ich hier etwas falsch, bitte helfen Sie mir, wenn hier jemand eine Idee hat.

88

Bearbeitete Antwort, um umfassendere Probleme zu behandeln

Ich denke, Sie verwirren die Methode für Fragmentierung und Aktivität. Hatte im letzten Monat ein ähnliches Thema für mein Projekt. Bitte überprüfen Sie, ob Sie schließlich Folgendes haben:

  1. Verwenden Sie in AppCompatActivity die Methode ActivityCompat.requestpermissions
  2. In v4 Support-Fragment sollten Sie requestpermissions verwenden.
  3. Wenn Sie AppcompatActivity.requestpermissions in Ihrem Fragment aufrufen, wird der Rückruf aktiv und nicht fragmentiert 
  4. Stellen Sie sicher, dass Sie super.onRequestPermissionsResult aus der onRequestPermissionsResult der Aktivität aufrufen.

Sehen Sie, ob es hilft. 

240
VarunJoshi129

Ich habe die Standortgenehmigung von einem Fragment angefordert und in dem Fragment musste ich Folgendes ändern:

            ActivityCompat.requestPermissions(getActivity(), new String[]{
                Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);

zu diesem:

            requestPermissions(new String[]{
                Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);

dann wurde das onRequestPermissionsResult im Fragment aufgerufen.

28
fullMoon

Die Methode requestPermissions bei Fragmenten erfordert API-Level 23 oder höher.
Wenn Ihre App auf eine niedrigere Version abzielt, können Sie verwenden

FragmentCompat.requestPermissions(this,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            ConstantVariables.READ_EXTERNAL_STORAGE);

Zuerst müssen Sie die Abhängigkeit von Support-V13 hinzufügen:

implementation "com.Android.support:support-v13:$supportLibVersion"
6
Juan Cruz Soler
private void showContacts() {
 if (getActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
         != PackageManager.PERMISSION_GRANTED) {
     requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
             PERMISSIONS_REQUEST_READ_STORAGE);
 } else {
     doShowContacts();
 }

}

 @Override
 public void onRequestPermissionsResult(int requestCode, String[] permissions,
     int[] grantResults) {
 if (requestCode == PERMISSIONS_REQUEST_READ_STORAGE
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
     doShowContacts();
 }

}

erlaubnis ändern

1
user2002721

Stellen Sie sicher, dass sowohl PERMISSION_REQUEST_CODE inonRequestPermissionsResult als auch in IhrerFragment denselben Wert enthält.

0
karenms

Für das tragetSDK 28 funktionieren die SDK-Prüfung (> 23) und die Anforderungsermächtigungen von fragment. ActivityCompat.requestPermissions schlägt fehl (wenn Sie den Anforderungscode unter 65536 festlegen, wird das Berechtigungsdialogfeld angezeigt, und wenn der Benutzer die Berechtigung zulässt, werden die Berechtigungen bereitgestellt, es erfolgt jedoch kein Rückruf. Wenn Sie jedoch 65536 festlegen, wird ActivityCompat.requestPermissions verwendet scheitern Sie sofort. Ich weiß nicht, was hinter dieser Logik steckt.

Arbeitscode:

  if (Build.VERSION.SDK_INT >= 23) {
                        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_ACCESS_REQUEST);
                    }
0