web-dev-qa-db-fra.com

Android: refus d'autorisation: démarrage de l'intention avec autorisation révoquée Android.permission.CAMERA

J'essaie de démarrer une activité ACTION_IMAGE_CAPTURE afin de prendre une photo dans mon application et le message d'erreur s'affiche dans le sujet.

Trace de la pile:

FATAL EXCEPTION: main
Process: il.ac.shenkar.david.todolistex2, PID: 3293
Java.lang.SecurityException: Permission Denial: starting Intent { act=Android.media.action.IMAGE_CAPTURE cmp=com.google.Android.GoogleCamera/com.Android.camera.CaptureActivity } from ProcessRecord{22b0eb2 3293:il.ac.shenkar.david.todolistex2/u0a126} (pid=3293, uid=10126) 
with revoked permission Android.permission.CAMERA

Les autorisations de la caméra sont ajoutées au fichier manifest.xml:

<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.READ_CALENDAR" />
<uses-permission Android:name="Android.permission.WRITE_CALENDAR" />
<uses-permission Android:name="Android.permission.VIBRATE" />
<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.CAMERA" />

Voici l'appel pour ouvrir la caméra:

RadioGroup radioGroup = (RadioGroup) findViewById(R.id.statusgroup);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId)
        {
            RadioButton rb = (RadioButton) findViewById(R.id.donestatusRBtn);
            if(rb.isChecked())
            {
                Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                    startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
                }
            }
        }
    });
19
David Faiz

salut, vous pouvez utiliser ces permissions dans votre fichier manifeste avec d'autres permissions,

<uses-feature
    Android:name="Android.hardware.camera.any"
    Android:required="true" />
<uses-feature
    Android:name="Android.hardware.camera.autofocus"
    Android:required="false" />

Si cela ne fonctionne toujours pas, vous utilisez peut-être Android M, vous devez donc ajouter des autorisations par programme.

voici l'exemple 

salut voici quelques étapes pour l’autorisation de configuration pour Android M et n’oubliez pas que vous devez également déclarer la même autorisation dans le fichier manifeste.

Étape 1. Déclarez la variable globale:

 public final int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 1;

//requests for runtime time permissions

 String CAMERA_PERMISSION = Android.Manifest.permission.CAMERA;


 String READ_EXTERNAL_STORAGE_PERMISSION = Android.Manifest.permission.READ_EXTERNAL_STORAGE;


String WRITE_EXTERNAL_STORAGE_PERMISSION = Android.Manifest.permission.WRITE_EXTERNAL_STORAGE;


// for security permissions
@DialogType
private int mDialogType;
private String mRequestPermissions = "We are requesting the camera and Gallery permission as it is absolutely necessary for the app to perform it\'s functionality.\nPlease select \"Grant Permission\" to try again and \"Cancel \" to exit the application.";
private String mRequsetSettings = "You have rejected the camera and Gallery permission for the application. As it is absolutely necessary for the app to perform you need to enable it in the settings of your device.\nPlease select \"Go to settings\" to go to application settings in your device and \"Cancel \" to exit the application.";
private String mGrantPermissions = "Grant Permissions";
private String mCancel = "Cancel";
private String mGoToSettings = "Go To Settings";
private String mPermissionRejectWarning = "Cannot Proceed Without Permissions</string>
<string name="explanation_permission_location_request">We are requesting the location permission as it is necessary for the app to perform search functionality properly.\nPlease select \"Grant Permission\" to try again and \"Cancel \" to deny permission.";

// crée un dialogue comme celui-ci.

// type of dialog opened in MainActivity
 @IntDef({DialogType.DIALOG_DENY, DialogType.DIALOG_NEVER_ASK})
 @Retention(RetentionPolicy.SOURCE)
 @interface DialogType {
    int DIALOG_DENY = 0, DIALOG_NEVER_ASK = 1;
 }

Étape 2. Utilisez ce code dans votre activité principale

@TargetApi(Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED && grantResults[2] == PackageManager.PERMISSION_GRANTED) {
                // Call your camera here.
            } else {
                boolean showRationale1 = shouldShowRequestPermissionRationale(CAMERA_PERMISSION);
                boolean showRationale2 = shouldShowRequestPermissionRationale(READ_EXTERNAL_STORAGE_PERMISSION);
                boolean showRationale3 = shouldShowRequestPermissionRationale(WRITE_EXTERNAL_STORAGE_PERMISSION);
                if (showRationale1 && showRationale2 && showRationale3) {
                    //explain to user why we need the permissions
                    mDialogType = ValueConstants.DialogType.DIALOG_DENY;
                    // Show dialog with 
                    openAlertDialog(mRequestPermissions, mGrantPermissions, mCancel, this, MyActivity.this);
                } else {
                    //explain to user why we need the permissions and ask him to go to settings to enable it
                    mDialogType = ValueConstants.DialogType.DIALOG_NEVER_ASK;
                    openAlertDialog(mRequsetSettings, mGoToSettings, mCancel, this, MyActivity.this);
                }
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

//check for camera and storage access permissions
@TargetApi(Build.VERSION_CODES.M)
private void checkMultiplePermissions(int permissionCode, Context context) {

    String[] PERMISSIONS = {CAMERA_PERMISSION, READ_EXTERNAL_STORAGE_PERMISSION, WRITE_EXTERNAL_STORAGE_PERMISSION};
    if (!hasPermissions(context, PERMISSIONS)) {
        ActivityCompat.requestPermissions((Activity) context, PERMISSIONS, permissionCode);
    } else {
        // Open your camera here.
    }
}

private boolean hasPermissions(Context context, String... permissions) {
    if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
    }
    return true;
}

Étape 3. Appelez cette méthode dans votre méthode oncreate,

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            checkMultiplePermissions(REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS, MyActivity.this);
   } else {
            // Open your camera here.
   }

Étape 4. Dialogue pour refuser l'autorisation

public static void openAlertDialog(String message, String positiveBtnText, String negativeBtnText,
                            final OnDialogButtonClickListener listener,Context mContext) {

    AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.AlertDialogCustom);
    builder.setPositiveButton(positiveBtnText, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            dialogInterface.dismiss();
            listener.onPositiveButtonClicked();
        }
    });
    builder.setPositiveButton(positiveBtnText, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            dialogInterface.dismiss();
            listener.onNegativeButtonClicked();
        }
    });

    builder.setTitle(mContext.getResources().getString(R.string.app_name));
    builder.setMessage(message);
    builder.setIcon(Android.R.drawable.ic_dialog_alert);
    builder.setCancelable(false);
    builder.create().show();
}

// Crée cette interface 

public interface OnDialogButtonClickListener {

void onPositiveButtonClicked();

void onNegativeButtonClicked();
}

et implémentez ceci dans votre activité où vous devez ajouter des autorisations.

@Override
public void onPositiveButtonClicked() {
    switch (mDialogType) {
        case ValueConstants.DialogType.DIALOG_DENY:
            checkMultiplePermissions(REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS, MyActivity.this);
            break;
        case ValueConstants.DialogType.DIALOG_NEVER_ASK:
            redirectToAppSettings(MyActivity.this);
            break;

    }
}

@Override
public void onNegativeButtonClicked() {

}

Et toute permission que vous pouvez appeler à partir d’ici et tous les résultats que vous pouvez obtenir dans la méthode de substitution onRequestPermissionsResult celle-ci.

je vous remercie

espérons que cela vous aidera (Y). 

14
Saveen Dhiman

Supprimer cette permission

  <uses-permission Android:name="Android.permission.CAMERA"/>

J'ai rencontré cette erreur lors de l'exécution de mon application sous Android 7. Après des tests, j'ai constaté que la permission de l'utilisateur n'appartenait pas au projet A, mais bien au projet B, que je n'avais testé que sur des appareils Android 5. Donc, je supprime cette autorisation dans le projet B afin de l'exécuter sur un autre appareil qui cible Android 7 et il pourrait enfin s'ouvrir. 

En outre, j'ai ajouté le code fournisseur de fichiers suggéré par Android ici https://developer.Android.com/training/camera/photobasics.html J'espère que cela vous aidera.

33
Gian Gomen

Dans mon cas, le problème était lié aux permissions de mon émulateur,

Pour résoudre le problème: 

1- Allez dans les paramètres de votre émulateur.

2- Recherchez les applications et les notifications.

3- Cliquez sur Ajouter une autorisation.

voir la photo: https://i.stack.imgur.com/z4GfK.png

4- Sélectionnez Caméra dans la liste. 

5- Recherchez votre application dans la liste fournie.

6- Activer la caméra.

voir la photo: https://i.stack.imgur.com/dJ8wG.pngEnjoy

Maintenant, vous pouvez utiliser votre caméra sur votre émulateur :)

5
private String [] permissions = {"Android.permission.WRITE_EXTERNAL_STORAGE", "Android.permission.ACCESS_FINE_LOCATION", "Android.permission.READ_PHONE_STATE", "Android.permission.SYSTEM_ALERT_WINDOW","Android.permission.CAMERA"};

sur votre OnCreate ajoutez ceci:

int requestCode = 200;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    requestPermissions(permissions, requestCode);
}
2
saurabh yadav

Pour les références futures, si quelqu'un rencontre le problème dans des projets Android liés à Flutter:

https://github.com/apptreesoftware/flutter_barcode_reader/issues/32#issuecomment-420516729

0
Vidor Vistrom