Неполадки с камерой на устройстве Android - PullRequest
13 голосов
/ 06 июня 2011

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

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

То есть:

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

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

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 06 июня 2011

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

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

3 голосов
/ 27 июля 2012

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

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);
}

РЕДАКТИРОВАТЬ: К сожалению, подход выше не всегда может работать :( ...

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

    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();
    }
2 голосов
/ 17 апреля 2014

Это функция, которую я использую. Он не называет каталоги 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());
                }
            }
        }
    }

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

...