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
    }
}
S.M_Emamian
la source
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");
    }
recrueDéveloppeur
la source
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);
ThetNaing Mizo
la source
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();
        }
    }
}
Evgeny Nozdrev
la source
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é.

Ryan
la source
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 {

}
Erik
la source
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.

Sergey
la source
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;
    }
}
Pranay Anand
la source
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
    )
}
codage jeremy
la source