我知道我的问题与this question和this 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设备中,我发现只创建了文件夹,但图像保存在默认位置,并且名称是自己的。
如何解决这个问题?是否无法找到为每个设备保存的图像的特定路径和名称?请帮帮我朋友。
答案 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());
}
}
}
}
我一直在寻找解决这个问题的方法。由于不同的制造商对相机文件夹的命名约定不同,因此这似乎涵盖了所有最佳选择。它很适合我。