So überprüfen Sie die Berechtigung im Fragment


94

Ich möchte eine Berechtigung in einem Fragment überprüfen.

Mein Code:

        // Here, thisActivity is the current activity
        if (ContextCompat.checkSelfPermission(getActivity(),
                Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {


            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
                    android.Manifest.permission.ACCESS_FINE_LOCATION)) {

                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.

            } else {

                // No explanation needed, we can request the permission.

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



                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        }

aber onRequestPermissionsResultnicht aufgerufen nach erlauben oder verweigern.

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

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

                Log.e("test","1");

                Intent intent = new Intent(getActivity(), MapsActivity.class);
                intent.putExtra("latitude", 35.694828);
                intent.putExtra("longitude", 51.378129);
                startActivity(intent);

            } else {
                utilityFunctions.showSweetAlertWarning(getActivity(),r.getString(R.string.str_warning_title_empty),
                        r.getString(R.string.str_you_must_allow_this_permission_toast),
                        r.getString(R.string.str_warning_btn_login));

                Log.e("test","2");
            }
            return;
        }

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

Antworten:


52

Ich habe Folgendes getan, um eine Berechtigung in einem Fragment zu überprüfen.

if (ActivityCompat.checkSelfPermission(getContext(),
            android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(getContext(),
                    android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
         requestPermissions(getActivity(),
                new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION,
                        android.Manifest.permission.ACCESS_FINE_LOCATION},
                REQUEST_LOCATION);
    } else {
        Log.e("DB", "PERMISSION GRANTED");
    }

3
Wir müssen noch um Erlaubnis bitten, wenn der Benutzer sie nicht gewährt hat.
Karan Thakkar

17
Denken Sie daran, dass in diesem Fall das Ergebnis Ihrer Anforderungsberechtigung zu der Aktivität gelangt, mit der Ihr Fragment gestartet wurde. Siehe ThetNaing Mizo ‚s Antwort auf eine Art und Weise Ergebnis in Ihrem Fragmente zu erhalten.
lsrom

259

So habe ich es gemacht, es funktioniert bei mir. Vielen Dank!

Für Aktivität:

ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);

Für Fragment:

requestPermissions(permissionsList, REQUEST_CODE);

Fragment requestPermissions erfordert Android M, ist jedoch in FragmentCompat für ältere API-Versionen verfügbar.
Brian White

20
Richtiger Weg, um Erlaubnis innerhalb eines Fragments anzufordern
Tarun

requestPermissions ist verwenden Marschall und Level up SDK
Hamid

Jetzt Standardteil der Fragment-Klasse in der AndroidX-Fragmentbibliothek, sodass FragmentCompat nicht erforderlich sein sollte (bei Verwendung von AndroidX).
big_m

81

Fragment hat requestPermissions()und onRequestPermissionsResult()Methoden, benutze es.

Ist checkSelfPermission()aber von ActivityCompat(nicht erforderlich Activity, nur Context).

if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    requestPermissions( //Method of Fragment
        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
        REQUEST_PERMISSIONS_CODE_WRITE_STORAGE
    );
} else {
    downloadImage();
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == REQUEST_PERMISSIONS_CODE_WRITE_STORAGE) {
        if (permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            proceedWithSdCard();
        }
    }
}

Fragment requestPermissions erfordert Android M, ist jedoch in FragmentCompat verfügbar.
Brian White

5

So behandeln Sie Berechtigungen in einer FragmentAufrufmethode requestPermissions. Wenn Sie die onRequestPermissionsResultMethode sowohl im Fragment als auch super.onRequestPermissionsResult(...)in der Aktivität überschreiben , die dieses Fragment enthält, stellen Sie sicher, dass Sie die Aktivitätsmethode aufrufen, um den Aufruf an die onRequestPermissionsResultMethode im Fragment weiterzugeben.


4

onRequestPermissionsResultwird in der Aktivität nicht das Fragment aufgerufen. Versuchen Sie onRequestPermissionsResultstattdessen, die Aktivität zu überschreiben .


Dies ist zwar wahr, aber es fehlt eine Erklärung, warum dies wahr ist und wie man es behebt - wie man onRequestPermissionResultin Fragmente gerät. Sowohl die Erklärung als auch die Art und Weise, wie das Ergebnis fragmentiert empfangen wird, werden in der Antwort von ThetNaing Mizo erläutert .
lsrom

Danke, ich habe mich gefragt, warum mein Code in Fragment
Azizjon Kholmatov

4

Mit Kotlin rufen requestPermissions(arrayOf(Manifest.permission.THE_PERMISSION_CODE_YOU_WANT), PERMISSION_REQUEST_CODE)Sie die folgende Überschreibung auf und fügen sie Ihrem Fragment hinzu

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out kotlin.String>, grantResults: IntArray): Unit {

}

3

Für mich hat es funktioniert , die onRequestPermissionsResult- Methode in der Aktivität aufzurufen , in der das Fragment implementiert ist, anstatt es im Fragment selbst aufzurufen. Innerhalb der onCreateView- Methode im Fragment:

    Button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE);

            if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_MEDIA);
            }else{
                //Do your work
                fetchMethod();
            }

        }
});

In der Aktivität, die beim Implementieren von Fragmenten außerhalb der onCreate- Methode hilft :

    @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_MEDIA:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                fetchMethod();

            }else{
                Toast.makeText(getApplicationContext(), "Permission not granted!", Toast.LENGTH_SHORT).show();
            }
            break;

        default:
            break;
    }
}


0

Ich war immer mit gestolpert checkSelfPermission()in ein Fragmentund fragen , was der beste Ansatz für sein würde , Contextist null (Kotlin spezifisch) ... soll ich verwenden !!oder etwas anderes ?

Ich habe mich für etwas anderes entschieden, das auf Code basiert , den ich in iosched gefunden habe . Werfen Sie einen Blick auf die Probe unten, und denken Sie daran, vor dem Fragmentzu ein angebracht ist Activity, die Contextnull sein wird.

private fun fineLocationPermissionApproved(): Boolean {

    val context = context ?: return false

    return PackageManager.PERMISSION_GRANTED == checkSelfPermission(
        context,
        Manifest.permission.ACCESS_FINE_LOCATION
    )
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.