аннулированное разрешение android.permission.CAMERA

Я получаю ERROR revoked permission android.permission.CAMERA

Я использовал разрешение камеры на манифест

private void dispatchTakePictureIntent(int actionCode) {

    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    switch (actionCode) {
        case ACTION_TAKE_PHOTO_B:
            File f = null;

            try {
                f = setUpPhotoFile();
                mCurrentPhotoPath = f.getAbsolutePath();
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
            } catch (IOException e) {
                e.printStackTrace();
                f = null;
                mCurrentPhotoPath = null;
            }
            break;

        default:
            break;
    } // switch

    startActivityForResult(takePictureIntent, actionCode);
}

и ошибка:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.mobile.lunatique.photo, PID: 3590
                  java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.android.camera2/com.android.camera.CaptureActivity clip={text/uri-list U:file:///KTP_42342.jpg} (has extras) } from ProcessRecord{2fbbd91 3590:com.mobile.lunatique.photo/u0a60} (pid=3590, uid=10060) with revoked permission android.permission.CAMERA
                      at android.os.Parcel.readException(Parcel.java:1599)
                      at android.os.Parcel.readException(Parcel.java:1552)
                      at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2658)
                      at android.app.Instrumentation.execStartActivity(Instrumentation.java:1507)
                      at android.app.Activity.startActivityForResult(Activity.java:3917)
                      at android.app.Activity.startActivityForResult(Activity.java:3877)
                      at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:842)
                      at com.mobile.lunatique.photo.MainActivity.dispatchTakePictureIntent(MainActivity.java:254)
                      at com.mobile.lunatique.photo.MainActivity.access$000(MainActivity.java:33)
                      at com.mobile.lunatique.photo.MainActivity$1.onClick(MainActivity.java:321)
                      at android.view.View.performClick(View.java:5198)
                      at android.view.View$PerformClick.run(View.java:21147)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
I/Process: Sending signal. PID: 3590 SIG: 9

Ответ 1

Вот как я решил эту проблему.

Вопреки тому, что говорят большинство других ответов, УДАЛИТЕ это из своего файла манифеста.

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

Почему?

Начиная с Android M (API 23), если ваше приложение имеет разрешение CAMERA, объявленное в манифесте, ему необходимо предоставить разрешение CAMERA для получения доступа к ACTION_IMAGE_CAPTURE.  и т.д.... тоже (которые обычно не требуют разрешения КАМЕРА самостоятельно). Если нет, то он автоматически вызывает исключение SecurityException.

Итак, что делать?

Вариант 1- Если вам нужен только ACTION_IMAGE_CAPTURE и т.д.

Удалите разрешение CAMERA из манифеста, и все будет в порядке

Вариант 2- Если вам тоже нужно разрешение CAMERA

Проверяйте разрешение CAMERA во время выполнения и запускайте намерение только при наличии разрешения

Ответ 2

Привет lunatique aldebaran,

Прежде всего вам нужно добавить следующее разрешение в файл manifest.xml.

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

Проверьте, является ли устройство андроидов Marshmallow или нет. Если его версия android M или больше, используйте следующий код, чтобы получить разрешение камеры динамически.

Перед тем, как андроид M не хочет получать динамическое разрешение.

проверьте, предоставил ли пользователь разрешение. Если пользователь не предоставил разрешение, запросите разрешение доступа к камере.

private static final int MY_CAMERA_REQUEST_CODE = 100;
if (checkSelfPermission(Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_GRANTED) {
           requestPermissions(new String[]{Manifest.permission.CAMERA},
                        MY_CAMERA_REQUEST_CODE);
            }

После запроса предупреждения о разрешении отобразится запрос разрешения, содержащий параметры allow и deny. После нажатия кнопки мы можем получить результат запроса с помощью следующего метода.

@Override

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == MY_CAMERA_REQUEST_CODE) {

            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Toast.makeText(this, "camera permission granted", Toast.LENGTH_LONG).show();

            } else {

                Toast.makeText(this, "camera permission denied", Toast.LENGTH_LONG).show();

            }

        }

Ответ 3

Отменить разрешение.... Просто скажите, что вы снова вызвали разрешение, поэтому не нужно снова писать разрешение для камеры в файле манифеста......

Вместо этого вам просто нужно написать две строки.... для READ и записи внешнего хранилища, которых достаточно для запуска вашей программы достаточно для запуска вашей программы

Ответ 4

Вместо этого вы должны использовать AppCompatActivity, расширяя свою MainActivity. А также, пожалуйста, включите stacktrace.

public class MainActivity extends AppCompatActivity {

//......
}

Ой, извини. С stacktrace он явно видел главную проблему. android.permission.CAMERA. Чтобы сделать запрос, вы должны создать проверку разрешений. Пожалуйста, проверьте этот пример, чтобы создать проверку разрешений.

Пример:

1) Включить в действие.

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

2) Убедитесь, что вы запрашиваете разрешения у пользователя:

if ( ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) {

            ActivityCompat.requestPermissions( this, new String[] {  android.Manifest.permission.ACCESS_COARSE_LOCATION  },
                                                LocationService.MY_PERMISSION_ACCESS_COURSE_LOCATION );
}

3) Проверка RunTime

if ( Build.VERSION.SDK_INT >= 23 &&
             ContextCompat.checkSelfPermission( context, android.Manifest.permission.CAMERA ) != PackageManager.PERMISSION_GRANTED) {
            return;
}

Ответ 5

У меня была похожая проблема, но похоже, что в Android есть ошибка с этим. Когда вы добавляете разрешение камеры в AndroidManifest

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

Вы должны дать разрешение на это, даже если вы хотите использовать внешнее приложение для фотографирования. Удаление его из манифеста решило проблему с SecurityException.