Comment vérifier l'autorisation dans un fragment


92

Je souhaite vérifier une autorisation dans un fragment.

mon 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.
            }
        }

mais onRequestPermissionsResultpas appelé après autorisation ou refus.

@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
    }
}

Possible duplication des autorisations d'exécution
R. Zagórski

Réponses:


50

J'ai fait ce qui suit pour vérifier une autorisation à l'intérieur d'un fragment.

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
Nous devons toujours demander l'autorisation si l'utilisateur ne l'a pas accordée.
Karan Thakkar

17
N'oubliez pas que si vous faites cela, le résultat de votre demande d'autorisation arrivera à l'activité qui a démarré votre fragment. Voir la réponse de ThetNaing Mizo pour un moyen de recevoir le résultat dans votre fragment.
2018

253

C'est comme ça que j'ai fait, ça marche pour moi. Merci!

Pour l'activité:

ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);

Pour le fragment:

requestPermissions(permissionsList, REQUEST_CODE);

Fragment requestPermissions nécessite Android M, mais il est disponible dans FragmentCompat pour les anciennes versions d'API.
Brian White le

20
Bonne façon de demander l'autorisation à l'intérieur d'un fragment
Tarun

requestPermissions is use marshal and level up sdk
hamid

76

Fragment a requestPermissions()et onRequestPermissionsResult()méthodes, utilisez-le.

Mais checkSelfPermission()est de ActivityCompat(pas obligatoire Activity, seulement 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 nécessite Android M mais il est disponible dans FragmentCompat.
Brian White

4

onRequestPermissionsResultest invoqué dans l'activité et non dans le fragment. Essayez onRequestPermissionsResultplutôt de remplacer dans l'activité.


Bien que cela soit vrai, il manque d'explication sur pourquoi cela est vrai et comment y remédier - comment obtenir un onRequestPermissionResultfragment. L'explication et la manière de recevoir le résultat fragmenté sont expliquées dans la réponse de ThetNaing Mizo .
lsrom

Merci, je me demandais pourquoi mon code ne fonctionne pas dans Fragment
Azizjon Kholmatov

4

En utilisant Kotlin, vous appelez requestPermissions(arrayOf(Manifest.permission.THE_PERMISSION_CODE_YOU_WANT), PERMISSION_REQUEST_CODE)et ajoutez le remplacement suivant à votre fragment

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

}

4

Pour gérer les autorisations dans une méthode d' Fragmentappel requestPermissions. Si vous remplacez la onRequestPermissionsResultméthode à la fois dans le fragment et dans l'activité, contenant ce fragment, assurez-vous d'appeler super.onRequestPermissionsResult(...)la méthode d'activité pour propager l'appel à la onRequestPermissionsResultméthode dans le fragment.


3

Ce qui a fonctionné pour moi a été d'appeler la méthode onRequestPermissionsResult dans l' activité à l' intérieur de laquelle le fragment est implémenté plutôt que de l'appeler dans fragment lui-même. À l'intérieur de la méthode onCreateView dans le 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();
            }

        }
});

Dans l'activité qui aide à implémenter le fragment, en dehors de la méthode onCreate :

    @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

Je me suis fait trébucher en utilisant checkSelfPermission()dans un Fragmentet je me demandais quelle serait la meilleure approche pour Contextêtre nul (spécifique à Kotlin) ... devrais-je utiliser !!ou autre chose ?

Je suis allé avec quelque chose d'autre basé sur le code que j'ai trouvé dans iosched . Jetez un œil à l'exemple ci-dessous et rappelez-vous, avant que le ne Fragmentsoit attaché à un Activity, le Contextsera nul.

private fun fineLocationPermissionApproved(): Boolean {

    val context = context ?: return false

    return PackageManager.PERMISSION_GRANTED == checkSelfPermission(
        context,
        Manifest.permission.ACCESS_FINE_LOCATION
    )
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.