Проблема с открытой камерой и захватом изображения

Я пытаюсь сделать простое приложение, которое использует приложение системной камеры для съемки. Я протестировал свое приложение на Android версии 6, и мое приложение успешно открывает камеру устройства. Но в некоторых устройствах Android v6 (например, Samsung Galaxy A3) возникает следующее исключение безопасности:

java.lang.SecurityException: 
     at android.os.Parcel.readException (Parcel.java:1621)
     at android.os.Parcel.readException (Parcel.java:1574)
     at android.app.ActivityManagerProxy.startActivity (ActivityManagerNative.java:3182)
     at android.app.Instrumentation.execStartActivity (Instrumentation.java:1541)
     at android.app.Activity.startActivityForResult (Activity.java:4298)
     at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult (BaseFragmentActivityJB.java:50)
     at android.support.v4.app.FragmentActivity.startActivityForResult (FragmentActivity.java:79)
     at android.app.Activity.startActivityForResult (Activity.java:4245)
     at android.support.v4.app.FragmentActivity.startActivityForResult (FragmentActivity.java:859)
     at iforest.photogps.MainActivity.captureImage (MainActivity.java:203)
     at iforest.photogps.MainActivity.access$000 (MainActivity.java:73)
     at iforest.photogps.MainActivity$1.onClick (MainActivity.java:130)
     at android.view.View.performClick (View.java:5721)
     at android.widget.TextView.performClick (TextView.java:10930)
     at android.view.View$PerformClick.run (View.java:22620)
     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:7331)
     at java.lang.reflect.Method.invoke (Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1230)
     at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)

Я уже добавляю проверки разрешений в свой код:

if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED 
         && ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
         && ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
    //TO do here if permission is granted by user
} else {
    //ask for permission if user didnot given
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        requestPermissions(new String[]{Manifest.permission.CAMERA,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
    }
}

а позже я вызываю изображение захвата:

private void captureImage() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    File photoFile = null;
    try {
        photoFile = createImageFile();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
    //fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
    String authorities = getApplicationContext().getPackageName() + ".provider";
    Uri imageUri = FileProvider.getUriForFile(this, authorities, photoFile);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

    // start the image capture Intent
    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);  <-- line 203

}

Из журналов я вижу, что вызывается строка 203 captureImage с startActivityForResult. Поскольку я уже запрашиваю разрешения камеры, почему я получаю SecurityException для открытия камеры в конкретном устройстве Samsung Galaxy A3 -Android 6? На других устройствах той же версии ошибки при открытии камеры не возникает.


person Thanos Infosec    schedule 04.05.2018    source источник
comment
Используйте это разрешение также ‹uses-permission android: name = android.permission.READ_EXTERNAL_STORAGE /›   -  person Alexandru Sandu    schedule 04.05.2018
comment
Обратитесь: - theappguruz.com/blog/ и да, вам также нужно добавить это разрешение ‹uses-permission android: name = android.permission.READ_EXTERNAL_STORAGE /›   -  person InsaneCat    schedule 04.05.2018
comment
Вы уверены, что не отказали в разрешении на фотосъемку на устройстве? Ваш код кажется неполным (// Сделать здесь, если разрешение предоставлено пользователем)   -  person Anton Malyshev    schedule 04.05.2018
comment
У меня уже есть разрешение READ_EXTERNAL_STORAGE в файле androidmanifest   -  person Thanos Infosec    schedule 04.05.2018


Ответы (1)


Я пытаюсь сделать простое приложение, которое использует приложение системной камеры для съемки

Нет единого «приложения для системной камеры». Ваш код запустит любое приложение камеры, которое пользователь хочет использовать, и будут сотни таких приложений, распределенных на ~ 10 000 моделей устройств Android и ~ 2 миллиардах устройств Android.

Поскольку я уже запрашиваю разрешения камеры, почему я получаю SecurityException для открытия камеры в конкретном устройстве Samsung Galaxy A3 -Android 6?

Заменять:

intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

с участием:

intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

и посмотрите, поможет ли это.

person CommonsWare    schedule 04.05.2018
comment
Дизайн разрешений для Android Hoho даже более странный, чем я мог себе представить. Зачем включать флаги разрешений в intents? - person Anton Malyshev; 04.05.2018
comment
@AntonMalyshev: Вам нужно разрешить другим приложениям использовать Uri из вашего FileProvider. Теперь, под прикрытием, для улучшения совместимости эти разрешения должны предоставляться автоматически для этого конкретного Intent действия и дополнительных, но всегда возможно, что Samsung внес изменения в них. По правде говоря, эта конкретная проблема обычно приводит к сбоям в приложении камеры, а не в приложении, запускающем приложение камеры, поэтому я скептически отношусь к этому, но попробовать стоит. - person CommonsWare; 04.05.2018