10

Мне нужно, чтобы пользователь сделал снимок (из галереи или из приложения для камеры) с Android 6.0.Захват изображения без разрешения с Android 6.0

Потому что мне не нужно управлять камерой, я хотел бы использовать намерение, как описано здесь:

Однако, если вам не нужен такой контроль, вы можете просто использовать ACTION_IMAGE_CAPTURE намерение к запросить изображение. Когда вы запустите намерение, пользователю будет предложено выбрать приложение для камеры (если оно еще не было приложением по умолчанию для камеры), и это приложение будет делать снимок. Приложение камеры возвращает изображение в метод onActivityResult() вашего приложения.

https://developer.android.com/preview/features/runtime-permissions.html

Но для этого ACTION_IMAGE_CAPTURE, вы должны заполнить дополнительные «MediaStore.EXTRA_OUTPUT» который является Ури во временный файл (без этого парам у меня будет только эскиз) , Этот временный файл должен находиться во внешнем хранилище (для доступа к приложению камеры). Для создания файла на внешнем хранилище вам нужно разрешение WRITE_EXTERNAL_STORAGE.

Так что это не возможно, чтобы захватить изображение с помощью родных диалогов/приложений без разрешения android.permission.CAMERA или android.permission.WRITE_EXTERNAL_STORAGE. Это верно?

Благодаря

+0

Вы можете попробовать передать 'content: //' 'Uri' в' EXTRA_OUTPUT', указывая на 'ContentProvider', который вы пишете, где вы можете принять данные. Я не пробовал этого, и я предполагаю, что будет множество приложений для камеры, которые не будут ожидать такого значения и будут задыхаться от него. – CommonsWare

+0

Вы когда-нибудь находили для этого работу? – AndroidEnthusiast

ответ

4

Это возможно, если вы на андроид 4.4 и выше, вы можете указать MediaStore.EXTRA_OUTPUT, чтобы быть файл под вашим для пакета каталогов

Начиная с Android 4.4, владелец, группа и режимы файлов на внешних устройствах хранения теперь синтезируются на основе структуры . Это позволяет приложениям управлять своими каталогами с конкретными пакетами на внешнем хранилище, не требуя, чтобы они имели широкое разрешение WRITE_EXTERNAL_STORAGE . Например, приложение с пакетом имя com.example.foo теперь может свободно получить доступ к Android/data/com.example.foo/на внешних устройствах хранения без разрешений . Эти синтезированные разрешения выполняются с помощью , обертывая необработанные устройства хранения данных в демоном FUSE.

https://source.android.com/devices/storage/

+0

Вы действительно пробовали это? Это дает вашему приложению доступ к каталогу, но не к приложению CAMERA, что является проблемой. –

+0

@ Derek Fung вы можете поделиться примером проекта? –

+0

Камера не имеет доступа к каталогу каталога виртуального кэша приложений. Решение @Jonathan Aste работает. – Makalele

1

Это возможно без любого из CAMERA и WRITE_EXTERNAL_STORAGE разрешений.

Вы можете создать временное место в каталоге кэша приложения и предоставить другим приложениям доступ к нему.Это делает файл доступную для записи с помощью приложения камеры:

File tempFile = File.createTempFile("photo", ".jpg", context.getCacheDir()); 
tempFile.setWritable(true, false); 

Теперь вам просто нужно передать этот файл в качестве выходного файла для умысла камеры:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempFile)); // pass temp file 
startActivityForResult(intent, REQUEST_CODE_CAMERA); 

Примечания: файл Ури не будет переданный вам в результате действия, вам нужно будет сохранить ссылку на tempFile и получить его оттуда.

+0

Кажется, что больше не работает, когда нацеливается на Marshmallow. – wiradikusuma

+0

этот вариант кажется многообещающим, у любого есть какая-либо обратная связь относительно совместимости? – Zapnologica

+0

Не работает. Приложение камеры не имеет доступа к директории кеша приложения. – Makalele

2

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

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()) 
      .format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
    return File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 
} 

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
    // Create the File where the photo should go 
    File photoFile = null; 
    try { 
     photoFile = createImageFile(); 
     takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath); 
    } catch (IOException ex) { 
     // Error occurred while creating the File 
     Log.e(TAG, "Unable to create Image File", ex); 
    } 

    // Continue only if the File was successfully created 
    if (photoFile != null) { 
     takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, 
       Uri.fromFile(photoFile)); 
    } else { 
     takePictureIntent = null; 
    } 
} 

Но вам все еще нужно WRITE_EXTERNAL_STORAGE разрешение до KITKAT:

<uses-permission 
    android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
    android:maxSdkVersion="18" /> 
6

Попробуйте это:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
File file = new File(getActivity().getApplicationContext().getExternalFilesDir(android.os.Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + "yourPicture.jpg"); 
Uri uri = Uri.fromFile(file); 
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, url); 

Это дает вам доступ к «внешнему» хранилищу, доступному для записи приложений для камеры, в этом случае, но файлы просто видны из вашего приложения. Чтобы узнать немного больше о складских помещениях в android см. https://www.youtube.com/watch?v=C28pvd2plBA

Надеюсь, это поможет!

+2

Это единственное рабочее решение, которое я нашел до сих пор, которое не ломается на Android 6. :) –

+0

Работа! Нет необходимости в WRITE_EXTERNAL_STORAGE или READ_EXTERNAL_STORAGE. – Makalele

+0

Спасибо! В 'onActivityResult' вы получите' RESULT_OK' и 'data == null'. В этом случае вы должны либо прочитать файл с пути (переменная 'uri'), либо просмотреть https://stackoverflow.com/questions/32043222/how-to-get-full-size-picture-and-thumbnail-from- камера-в-же-намерения. Вы должны получить разрешение на чтение файлов по API> = 23. – CoolMind