Android设备特定的摄像头路径问题

时间:2011-06-06 07:23:10

标签: android image camera storage

我知道我的问题与this questionthis one重复。但我仍然有一些问题,所以不要试图关闭或低估我的问题朋友。请完整地回答这个问题。

在我的应用中,我想将图像存储到设备本机相机存储它们的同一文件夹中。根据我的研究,我发现每个设备都将图像存储在不同的名称和不同的文件夹中。

那是:

  • Nexus-One将其相机文件存储到名为Camera (/ sdcard / DCIM / Camera)的文件夹中。

  • 所有HTC设备都将其相机文件存储到名为100MEDIA 的文件夹中(/ sdcard / DCIM / 100MEDIA)。

  • Sony Xperia x10将其相机文件存储到名为100ANDRO 的文件夹中(/ sdcard / DCIM / 100ANDRO)。

  • Motorola MilesStone将其相机文件存储到名为Camera (/ sdcard / DCIM / Camera)的文件夹中。

所以我想知道是否可以通过编程方式获取此路径,以便将从应用程序中获取的图像存储到同一位置?

当我在谷歌搜索时,我发现最好创建一个我自己的外部文件夹,以便我可以使用我指定的名称将图像存储在该路径中。之后,在API版本3(Android 1.5)的HTC设备中,我发现只创建了文件夹,但图像保存在默认位置,并且名称是自己的。

如何解决这个问题?是否无法找到为每个设备保存的图像的特定路径和名称?请帮帮我朋友。

3 个答案:

答案 0 :(得分:4)

如果API级别低于7,请使用getExternalStorageDirectory(),然后附加/ Pictures以获取照片存储的路径。

for API level> 7使用getExternalStoragePublicDirectory(DIRECTORY_PICTURES)。

答案 1 :(得分:3)

我使用以下代码

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

实用工具:

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 :(得分:2)

这是我正在使用的功能。它没有专门命名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());
                }
            }
        }
    }

我一直在寻找解决这个问题的方法。由于不同的制造商对相机文件夹的命名约定不同,因此这似乎涵盖了所有最佳选择。它很适合我。