1
votes

dernière variable booléenne statique déclarée dans la méthode

J'ai un bouton d'autorisation de caméra, sur l'écouteur de clic de bouton j'ai 2 conditions principales suivantes. 1: si la permission est accordée, accédez simplement à l'activité de la caméra ... 2: else vérifie 2 autres conditions (1: je vérifie (en utilisant une variable booléenne) si "" ne plus demander l'autorisation "" est cochée dans la boîte de dialogue puis va aux paramètres .... 2: demande la permission autrement).

Et dans la méthode onRequestPermissionsResult, j'ai vérifié si l'utilisateur accorde l'autorisation, puis accédez à l'activité de la caméra ... sinon vérifiez si l'utilisateur a coché "" ne pas demander à nouveau l'autorisation "" défini sur true cette variable booléenne sinon affiche l'autorisation refusée.

Tout fonctionne correctement, mais lorsque je redémarre l'activité, il définit cette variable booléenne comme false (maintenant si l'utilisateur a peut-être coché "", ne demandez pas à nouveau l'autorisation "" la dernière fois) et cela devrait amener l'utilisateur aux paramètres mais il pas au premier clic, après un clic (lorsque cette variable booléenne est définie sur true), cela fonctionnera. Donc ma question est de savoir comment définir cette variable booléenne final (pour qu'elle ne change pas au redémarrage de l'activité) dans la méthode onRequestPermissionsResult et l'utiliser dans la méthode onCreate (hors de portée).

voici le bouton en cliquant code d'écoute dans onCreate.

@Override
public void onRequestPermissionsResult(int RC, String per[], int[] PResult) {

    switch (RC) {

        case RequestPermissionCode:

                if (PResult[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(GalleryImageSelection.this, "Permission Granted, Now your application can access CAMERA.", Toast.LENGTH_LONG).show();

                    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(intent, 7);

                } else {
                   // for (int i = 0, len = per.length; i < len; i++) {
                     //   String permission = per[i];
                        if (PResult[0] == PackageManager.PERMISSION_DENIED){
                    boolean showRational =shouldShowRequestPermissionRationale(per[0]);
                    if (!showRational){
                        test = true;//test is declared above onCreate for 
                                    //scope purpose
                    }
                    else if (CAMERA.equals(per[0])) {
                        Toast.makeText(GalleryImageSelection.this, "Permission Denied, your application cannot access CAMERA.", Toast.LENGTH_LONG).show();

                    }
                }
                    }

                break;
            }
    }

voici le code de méthode onRequestPermissionsResult

                if (checkPermission())
               {

                Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

                startActivityForResult(intent, 7);
               // Toast.makeText(GalleryImageSelection.this,"CAMERA permission allows us to Access CAMERA app", Toast.LENGTH_LONG).show();

            }
            else {
                if (test){ //test is that boolean variable
                    Uri packageUri = Uri.fromParts( "package", getApplicationContext().getPackageName(), null );

                    Intent intent = new Intent();

                    intent.setAction( Settings.ACTION_APPLICATION_DETAILS_SETTINGS );
                    intent.setData( packageUri );
                    intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );

                    startActivity( intent );
                }else {
                ActivityCompat.requestPermissions(GalleryImageSelection.this,new String[]{
                        Manifest.permission.CAMERA}, RequestPermissionCode);

            } }


1 commentaires

Pourquoi ne pas utiliser sharedpreference pour garder une trace de.


3 Réponses :


0
votes

Il n'est pas nécessaire d'utiliser ce booléen pour gérer l'autorisation

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults != null && grantResults.length > 0) {
            switch (requestCode) {
                case 1001:
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                         Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 7);
                    } else {
                         if (ActivityCompat.shouldShowRequestPermissionRationale(HomeActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                        Toast.makeText(this, "Please allow permission", Toast.LENGTH_SHORT).show();
                    } else {
                        AlertDialog dialog= new AlertDialog.Builder(HomeActivity.this)
                                .setMessage("Apply permission")
                                .setPositiveButton("Open Settings", new DialogInterface.OnClickListener() {

                                    public void onClick(DialogInterface dialog, int whichButton) {
                                        Uri packageUri = Uri.fromParts( "package", getApplicationContext().getPackageName(), null );
                                        Intent intent = new Intent();
                                        intent.setAction( Settings.ACTION_APPLICATION_DETAILS_SETTINGS );
                                        intent.setData( packageUri );
                                        intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
                                        startActivity( intent );
                                    }

                                })
                                .create();
                        dialog.show();
                    }
                    }
                    break;

            }
        }
    }

et dans onRequestPermissionsResult

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (checkSelfPermission(Manifest.permission.CAMERA)  != PackageManager.PERMISSION_GRANTED) {
                        requestPermissions(new String[]{Manifest.permission.CAMERA}, 1001);
                    } else {
                       Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 7);
                    }
                } else {
                    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 7);
                } 


1 commentaires

ne pas aider, je gère le cas "lorsque l'application affiche la boîte de dialogue de demande d'autorisation, si l'utilisateur clique sur la case à cocher ne plus afficher et refuse l'autorisation, la prochaine fois que l'utilisateur clique à nouveau sur le bouton, l'utilisateur doit accéder aux paramètres. fonctionne mais le problème est que lorsque l'utilisateur redémarre l'activité, cela ne fonctionnera pas pour la première fois,




0
votes

Je l'ai résolu en utilisant sharedpreference. Je mets une valeur booléenne dans sharedpreference comme ceci:

 sharedpreferences = getSharedPreferences(mypreference,
                    Context.MODE_PRIVATE);
            boolean checked = sharedpreferences.getBoolean("isChecked", false);
            if (checkPermission())
            {
                Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent, 7);
            }
            else if(checked)
            {
                openSetting();
            }else {

                requestPermission();
            }

et l’introduis sur le bouton Cliquez comme ceci:

if (!showRational){
                        boolean isChecked= true;
                        sharedpreferences = getSharedPreferences(mypreference,
                                Context.MODE_PRIVATE);
                        SharedPreferences.Editor editor = sharedpreferences.edit();
                        editor.putBoolean("isChecked", isChecked);
                        editor.commit();
                    }

maintenant quand je redémarre le activité, cela ne changera pas la valeur de la variable booléenne.

Donc la conclusion est "si quelqu'un veut utiliser une variable:

-qui doit être déclarée et initialisée dans une méthode et devrait être appelé dans une autre méthode (hors de portée), - (OR) qui doit être initialisé une fois dans une METHODE et ne devrait jamais être changé, Plus devrait être disponible dans N'importe quelle méthode.

nous enregistrerons la valeur de cette variable dans sharedpreference et l'obtiendrons où nous voulons ça.


0 commentaires