【问题标题】:Android device specific camera path issueAndroid设备特定的相机路径问题
【发布时间】:2011-09-09 02:02:12
【问题描述】:

我知道我的问题与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 设备中,我发现只有文件夹被创建,但图像以自己的名称保存在默认位置。

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

【问题讨论】:

  • 我认为所有“最新”手机 (v4.0+) 都使用 Camera 文件夹。
  • @AlikElzin-kilaka 我的 xperia z3 和 z5 都在 DCIM/100ANDRO FYI 中的 v5.1.1 商店

标签: android image camera storage


【解决方案1】:

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

对于 API 级别 > 7,请使用 getExternalStoragePublicDirectory (DIRECTORY_PICTURES)。

【讨论】:

  • 对不起,我无法理解你能用一些代码解释一下吗?
  • 但图片/ - 所有照片(不包括用相机拍摄的照片)。
  • 这给了我 /storage/emulated/0/Pictures/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();

在哪里使用:

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

【讨论】:

    【解决方案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());
                    }
                }
            }
        }
    

    我自己一直在寻找解决这个问题的方法。由于不同的制造商对相机文件夹有不同的命名约定,这似乎涵盖了所有领域。它对我很有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      相关资源
      最近更新 更多