it-swarm.com.de

Fordern Sie Laufzeitberechtigungen von Version 4 an.

Ich habe ein komisches Problem, das einen Konflikt verursacht. Ich musste zu native Fragments wechseln, um das Problem zu beheben, aber es gibt Fehler.

Mein ursprüngliches Problem: Ich habe eine Navigationsschublade-Einrichtung mit v4 Fragments. Um in einem meiner Fragmente nach Erlaubnis zu fragen, rufe ich ActivityCompat.requestPermissions(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION, 1); The Prompt auf, aber wenn ich die Erlaubnis akzeptiere oder ablehne, passiert nichts. Der Callback onRequestPermissionsResult() wird nie aufgerufen. Stattdessen wird es in der Aktivität aufgerufen, mit der meine Fragmente verbunden sind. Für mich nutzlos, ich brauche den Rückruf, um im Fragment zu arbeiten.

In diesem Sinne wurde mir gesagt, dass ich FragmentCompat verwenden muss, aber das funktioniert nur mit native Fragments (v13+). Daher änderte ich die Navigationsleiste von nativen Fragments anstelle der v4-Supportbibliothek Fragments. Allerdings , weil ich AppCompatActivity verwende, funktionieren bestimmte Dinge nicht, wie addToBackStack() und gehen auf ein vorheriges Fragment zurück.

Um es kurz zu machen: Weiß jemand, wie ich den v4.Fragment verwenden kann und trotzdem in der Fragment um Erlaubnis bittet und den Rückruf in der Fragment abruft? Ich glaube, dies ist ein Fehler in Android, der nicht angesprochen wurde, aber ich bin nicht 100% ig. 

Lassen Sie mich wissen, wenn Sie meinen Code sehen müssen, es sind nur die Standardmethoden, die Sie für die Laufzeitberechtigungen benötigen. Ich würde jedoch gerne mit v4 Fragments arbeiten, was meines Erachtens nicht funktioniert.

55
RED_

Dieses Verhalten scheint in der v4 Fragment-Support-Klasse requestPermissions in Fragment vorhanden zu sein. Die Activity/FragmentCompat-Implementierungen sind für Benutzer vorhanden, die die nativen Klassen mit der erweiterten Funktionalität auf API-Ebenen zwischen 11 und 23 verwenden möchten.

18
NasaGeek

Das Hinzufügen zu der übergeordneten Aktivität funktioniert für mich:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    List<Fragment> fragments = getSupportFragmentManager().getFragments();
    if (fragments != null) {
        for (Fragment fragment : fragments) {
            fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

Quelle: https://code.google.com/p/Android/issues/detail?id=189121#c5

66
Samuel Gaona

Wenn Sie die BerechtigungResult in fragment v4 benötigen, stellen Sie sicher, dass Sie diese verwenden

Fragment.requestPermission(String[], int);

anstatt 

AppCompat.requestPermission(Activity, String[], int)

Check out das antwort!

18
DoruChidean

Sie können diesen Teil des Codes verwenden

requestPermissions(new String[]{Manifest.permission.GET_ACCOUNTS}, PERMISSION_REQUEST_CODE);
11
Abubakar

Ich war vor kurzem in derselben Situation, als ich im Support-Fragment nach einer Berechtigung suchen und dort einen Rückruf erhalten musste. 

Ich konnte ContextCompat für checkSelfPermission verwenden und dann, als @NasaGeek sagte, Android.support.v4.app.Fragments requestPermissions aufgerufen haben, um die Berechtigung anzufordern, und dann einen Aufruf an onRequestPermissionsResult in v4 Fragment erhalten. 

Hoffe das hilft. 

Vielen Dank. 

7

Im Moment ist die stabilste Lösung die Handarbeit. Ich selbst löste es einfach, indem ich untergeordnete Fragmente von den Elternfragmenten benachrichtigte.

if (fragment.getParentFragment() != null) {
                            Fragment parentFragment = fragment.getParentFragment();
                            try {
                                ChildFragmentPermissionRegistry registry = (ChildFragmentPermissionRegistry) parentFragment;
                                registry.registerPermissionListener((ChildFragmentPermissionCallback) fragment);
                                parentFragment.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_REQUEST_CODE);
                            } catch (ClassCastException e) {
                                Log.e(PermissionVerifier.class.getSimpleName(), e.getMessage());
                            }
                        } else {
                            fragment.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_REQUEST_CODE);
                        }

Wenn das übergeordnete Fragment die Schnittstelle ChildFragmentPermissionRegistry implementiert und das untergeordnete Fragment registriert,

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (callback != null) {
        callback.onRequestPermissionsResult(requestCode, permissions, grantResults);
        callback = null;
    }
}

und untergeordnete Fragmente implementiert ChildFragmentPermissionCallback

und Schnittstellen sind ungefähr so:

public interface ChildFragmentPermissionCallback {
    void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults);
}

public interface ChildFragmentPermissionRegistry {
    void registerPermissionListener(ChildFragmentPermissionCallback callback);
}
2

v4.Fragment funktioniert gut. Ich habe ein Problem mit dem verschachtelten Fragment von v4.Fragment. Es wird um Erlaubnis gefragt, aber der Rückruf beiRequestPermissionsResult () wird niemals in einem geschachtelten Fragment aufgerufen!

Ausgabe eröffnet

2
android_dev

Ich weiß nicht, ob es kürzlich von Google behoben wurde, aber ich kann das erwartete Ergebnis erreichen, ohne irgendwelche Tricks auszuführen.

Das Wichtigste ist, super.onRequestPermissionsResult(requestCode, permissions, grantResults); in der Aktivität aufzurufen, damit das Ergebnis an fragment übergeben wird, wenn es von fragment angefordert wird.

Also was ich mache ist:

1) Fragen Sie im Fragment nach der Erlaubnis mit v4 fragment.requestPermissions(permissions, requestCode).

2) in onRequestPermissionsResult der Aktivität muss super.onRequestPermissionsResult(requestCode, permissions, grantResults); aufgerufen werden

3) Schreiben Sie in onRequestPermissionsResult des Fragments den Code, den ich mit dem Ergebnis behandeln möchte.

1
YunhaoLIU

In meinem Fall habe ich die Erlaubnis des Fragments beantragt und muss auch die Antwort in Fragment erhalten.

Aber mein Telefon läuft auf Android 8.1

daher musste ich eine weitere Bedingung hinzufügen, um dies zu überprüfen

irgendwann gibt es meine Lösung

private void doOnWazeButtonClick()
{
    int permissionStatus = PackageManager.PERMISSION_DENIED;

    if (getContext() != null)
    {
        permissionStatus = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION);
    }

    if (permissionStatus == PackageManager.PERMISSION_GRANTED)
    {
        showContentWaze();
    }
    else
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        {
            Objects.requireNonNull(getActivity()).requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_PERMISSION_ACCESS_FINE_LOCATION);
        }
        else
        {
            requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_PERMISSION_ACCESS_FINE_LOCATION);
        }
    }
}