web-dev-qa-db-ja.com

Android:許可の拒否:許可を取り消してIntentを開始するAndroid.permission.CAMERA

アプリで写真を撮るためにACTION_IMAGE_CAPTUREアクティビティを開始しようとしていますが、件名にエラーが表示されています。

スタックトレース:

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

カメラのアクセス許可が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" />

カメラを開くための呼び出しは次のとおりです。

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);
                }
            }
        }
    });
24
David Faiz

こんにちは、マニフェストファイルでこれらの権限を他の権限で使用できます。

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

それでも動作しない場合は、Android M、SOを使用している可能性があります。プログラムで権限を追加する必要があります。

ここに例があります

こんにちは、Android Mのセットアップ許可の手順がいくつかあります。マニフェストファイルでも同じ許可を宣言する必要があります。

手順1.グローバル変数を宣言します。

 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.";

//このようなダイアログを作成します。

// 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;
 }

ステップ2.このコードをメインアクティビティで使用する

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

ステップ3. oncreateメソッドでこのメソッドを呼び出し、

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

ステップ4.許可拒否のダイアログ

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();
}

//このインターフェースを作成します

public interface OnDialogButtonClickListener {

void onPositiveButtonClicked();

void onNegativeButtonClicked();
}

許可を追加する必要があるアクティビティでこれを実装します。

@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() {

}

そして、ここから呼び出すことができるすべての許可と、オーバーライドメソッドonRequestPermissionsResultで取得できるすべての結果。

ありがとうございました

これがお役に立てば幸いです(Y)。

16
Saveen

この許可を削除

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

Android 7.でアプリを実行中にこのエラーに直面しました。テスト後、ユーザー許可がプロジェクトAにないことに気付きました。ただし、プロジェクトBでは、Android 5台のデバイスでしかテストしていません。したがって、プロジェクトBの権限を削除して、Android 7そして最終的に開くことができました。

Adittionで、Androidがここに示唆する https://developer.Android.com/training/camera/photobasics.html これが役に立てば幸いです。

41
Gian Gomen

私の場合、問題はエミュレータの許可に関連していた、

問題を修正するには:

1-エミュレータの設定に移動します。

2-アプリと通知を探します。

3- [権限の追加]をクリックします。

写真を参照してください: https://i.stack.imgur.com/z4GfK.png

4-リストのカメラを選択します。

5-提供されたリストでアプリケーションを探します。

6-カメラを有効にします。

写真を参照してください: https://i.stack.imgur.com/dJ8wG.pngEnjoy

これで、エミュレータでカメラを使用できます:)

8
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"};

あなたのOnCreateにこれを追加してください:

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

今後の参照のために、誰かがフラッター関連のAndroidプロジェクトで問題に遭遇した場合:

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

0
Vidor Vistrom

他の誰かがこの問題に遭遇した場合、私の問題は、実行時にアプリが許可を要求していなかったことです。 xiaomiデバイスは、adbを介してインストールされたアプリへのアクセス許可を自動的に拒否するようです。設定で許可を有効にしただけで、うまくいきました。

0
Joseph Sang