Подтвердить что ты не робот

Проблема со спецификой камеры для устройства Android

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

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

То есть:

  • Nexus-One хранит файлы своей камеры в папке с именем Camera (/sdcard/DCIM/Camera).

  • Все устройства HTC хранят файлы своих камер в папке с именем 100MEDIA (/sdcard/DCIM/100MEDIA).

  • Sony Xperia x10 хранит файлы своих камер в папке с именем 100ANDRO (/sdcard/DCIM/100ANDRO).

  • Motorola MilesStone хранит файлы своей камеры в папке с именем Camera (/sdcard/DCIM/Camera).

Итак, я хотел знать, возможно ли программно получить этот путь, чтобы я мог сохранять изображения, полученные из моего приложения, в одно и то же место?

Когда я был googling, я узнал, что лучше создать собственную внешнюю папку, чтобы я мог хранить изображения в этом пути с именем, которое я указываю. После этого также в устройстве HTC API версии 3 (Android 1.5) я узнал, что создается только папка, но изображение сохраняется в своем месте по умолчанию с собственным именем.

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

4b9b3361

Ответ 1

Используйте getExternalStorageDirectory(), если уровень API ниже 7, а затем добавьте/Картинки, чтобы получить путь к хранилищу фотографий.

для уровня API > 7 используйте getExternalStoragePublicDirectory (DIRECTORY_PICTURES).

Ответ 2

Я использую следующий код

String pictures_path = Utils.getRealPathFromURI(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
File path = new File(pictures_path);
if (path.isFile())
    path = path.getParentFile();

Где Utils:

public static String getRealPathFromURI(Uri content_uri, int media_type) {
    String column = MediaType.MEDIA_TYPE_PICTURE;       
    ContentResolver content_resolver = getContext().getContentResolver();
    String [] proj = { column };
    Cursor cursor = content_resolver.query(content_uri,
                    proj, // Which columns to return
                    null, // WHERE clause; which rows to return (all rows)
                    null, // WHERE clause selection arguments (none)
                    null); // Order-by clause (ascending by name)
    int column_index = cursor.getColumnIndexOrThrow(column);
    if (!cursor.moveToFirst())
        return null;
    return cursor.getString(column_index);
}

EDIT: К сожалению, подход выше не всегда может работать:(...

В конце концов я сделал ручные проверки:

    File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
    if (path.exists()) {
        File test1 = new File(path, "100MEDIA/");
        if (test1.exists()) {
            path = test1;
        } else {
            File test2 = new File(path, "100ANDRO/");
            if (test2.exists()) {
                path = test2;
            } else {
                File test3 = new File(path, "Camera/");
                if (!test3.exists()) {
                    test3.mkdirs();
                }
                path = test3;
            }
        }
    } else {
        path = new File(path, "Camera/");
        path.mkdirs();
    }

Ответ 3

Это функция, которую я использую. Он специально не определяет каталоги 100Media или Camera. Он просто запускается в папке /DCIM и смотрит на своих детей. Если ребенок не является каталогом .thumbnails(или, в зависимости от того, что вы делаете), посмотрите на его детей и получите их. Он также получает изображения в самом каталоге /DCIM.

File dcim = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
    File thumbnails = new File(dcim, "/.thumbnails");
    File[] listOfImg = dcim.listFiles();
    if (dcim.isDirectory()){
        //for each child in DCIM directory
        for (int i = 0; i < listOfImg.length; ++i){
            //no thumbnails
            if( !listOfImg[i].getAbsolutePath().equals(thumbnails.getAbsolutePath()) ){
                //only get the directory (100MEDIA, Camera, 100ANDRO, and others)
                if(listOfImg[i].isDirectory()) {
                    //is a parent directory, get children
                    File[] temp = listOfImg[i].listFiles();
                    for(int j = 0; j < temp.length; ++j) {
                        f.add(temp[j].getAbsolutePath());
                    }
                }else if(listOfImg[i].isFile()){
                    //is not a parent directory, get files
                    f.add(listOfImg[i].getAbsolutePath());
                }
            }
        }
    }

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