2017-01-21 14 views
-4

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

Как бы это осуществить?

Как узнать расположение файлов камеры?

Как узнать текущее соглашение об именах?

Как получить права доступа к этому каталогу?

Любой ответ будет оценен.

UPDATE

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

UPDATE 2

Пожалуйста, объясните, почему, черт возьми, вы downvoting ??

UPDATE 3

пришло время попробовать все советы, и я нашел все, что они неверны. Просто невероятно, сколько легенд здесь идет на Stackoverflow ...

+1

Пара вещей: у вас есть очень открытый вопрос. Он содержит несколько вопросов вместо одного, на который можно ответить. Есть много руководств в Интернете для более тех задач, с которыми вы пытались и с которыми возникают проблемы? И вопросы для предложений по библиотекам или учебным программам не приветствуются на этом сайте, так как на них невозможно ответить окончательно. –

+8

Существует ~ 2 миллиарда устройств Android, начиная с тысяч моделей. Есть сотни различных приложений для камер, которые по умолчанию отправляются по этим моделям, а также сотни дополнительных приложений для камер, доступных для загрузки из Play Маркета и в других местах. Не существует единого приложения «Камера». Вы можете использовать «Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DCIM)», чтобы получить общее местоположение, но нет никаких требований к тому, чтобы какое-либо данное приложение камеры помещало туда свои фотографии или называло их каким-то стандартным форматом. – CommonsWare

+2

Вы можете многому научиться у проекта OpenCamera на GitHub –

ответ

3

Вы не можете писать точно в ту же папку, что и приложение камеры по умолчанию. Но вы можете использовать Environment.getExternalStoragePublicDirectory (Environment.DI RECTORY_DCIM)

mediaStorageDir = newFile(Environment.getExternalStorageDirectory(),FOLDER_NAME) 
Intent takePictureFromCameraIntent = newIntent(MediaStore.ACTION_IMAGE_CAPTURE); takePictureFromCameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(mediaStorageDir)); 
startActivityForResult(takePictureFromCameraIntent,100); 

Но обратите внимание, что это создаст только подпапку в директории DCIM и не будет хранить именно там, где магазины камеры по умолчанию , Но вы всегда можете создавать подпапки с любым вашим именем требуемой папки.

`

+0

Firs, ваше предложение работает только в том случае, если камера настроена для записи во внутреннюю память. Если он настроен на запись на SD-карту, ваш путь будет неактуальным. Во-вторых, мне не нужно создавать папки, мне нужно написать ровно то же место, что и камера. Это вопрос. – Dims

+1

Насколько я знаю, вы не можете писать точно, где камера. –

1

Что нужно иметь в виду, для этого ответа:

  • Каждый производитель телефона создает свою собственную Camera App, с учетом их оборудования.

  • С правом доступа, приложение может написать (почти) везде они хотят ...

Теперь вопрос (ы):

Во-первых, мы не знаем где хранятся фотографии, и что такое соглашение об именах. У каждого и их матери есть другое представление о том, что лучше. Поэтому нет «Эй, это всегда есть».

Те, кто ищет найдет: читается & запись permissions для всего устройства. С этим поиском все устройство найдет в каких папках находятся изображения. Теперь вычтите папки, которые поступают из «социальных сетей».Я предполагаю, что папка с наиболее или последними изображениями будет той, которая вам нужна. Разумеется, вам понадобятся тестеры, которые вам доверяют.

Все, что найдены не были неорганизованными: просто найти шаблон, используемый. Для этого может быть стандарт. У крупных компаний наверняка будет один. Вы можете спросить устройство, что у него есть maker. Обратите внимание, что этот ответ может быть неправильным.

Это не фотография, нет, это фотография: И тогда вы получите забавную часть accessing the camera. Хорошие времена. Помните: request picture => получить местоположение изображения в памяти => сохранить изображение как файл. Лучшая часть, нет применения всех частей этого API, поэтому различным устройствам нужны разные инструкции ...

Удачи! & Удачи!

пс, downvotes, вероятно, из-за отсутствия кода

+0

Нет, нисходящие стороны от сторонников конкурса непобеждений. Они смещаются, если люди хотят делать свои приложения, разрешенные делать – Dims

3

Как бы это сделать?

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + File.separator + "You Dir. Name"; 

, если добавить любую строку, чтобы закончить эту

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)

это создаст dir внутри папки

Как узнать расположение файлов камеры?

По умолчанию камера использует это место

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)

Как знать текущее соглашение об именовании?

IMG_yyyyMMDD_timeStamp

Как получить права доступа к этому каталогу?

Использование менеджера разрешений для разрешения камеры и внешнего хранения

0

Попробуйте использовать этот код, вы можете сохранить изображение в каталоге с помощью вставки запроса

String imgSaved = MediaStore.Images.Media.insertImage(
       getContentResolver(), bitmap, 
       System.currentTimeMillis() + ".jpg", "DESCRIPTION HERE"); 

Для получения более подробной информации см link

+0

Попробуйте использовать FileProvider для хранения изображений в любом месте, где хотите, от android n onwards [Fileprovider] https://developer.android.com/reference/android/support/v4/content/ FileProvider.html –

+0

@AnujJPandey ваш код записывается в '/ storage/emulated/0/Pictures /', в то время как мне нужно писать в '/ storage/9C33-6BBD/DCIM/Camera' – Dims

+0

ContentValues ​​values ​​= new ContentValues ​​(); values.put (MediaStore.Images.ImageColumns.DATA, данные); Uri uri = resolver.insert (MediaStore.Images.Media.EXTERNAL_CONTENT_URI, значения); –

0

Я нашел этот код полезным для выбора последней используемой папки DCIM/Camera.

String getDCIMCamera() { 
    try { 
     String[] projection = new String[]{ 
       MediaStore.Images.ImageColumns._ID, 
       MediaStore.Images.ImageColumns.DATA, 
       MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, 
       MediaStore.Images.ImageColumns.DATE_TAKEN, 
       MediaStore.Images.ImageColumns.MIME_TYPE}; 

     Cursor cursor = getContentResolver().query(
       MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
       projection, 
       null, 
       null, 
       MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC"); 
     if (cursor != null) { 
      cursor.moveToFirst(); 
      do { 
       String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); 
       if (path.contains("/DCIM/")) { 
        File file = new File(path); 
        path = file.getParent(); 
        cursor.close(); 
        return path; 
       } 
      } while (cursor.moveToNext()); 
      cursor.close(); 
     } 
    } 
    catch (Exception e) { 
    } 
    return ""; 
}