Ответ 1
Используйте getExternalStorageDirectory(), если уровень API ниже 7, а затем добавьте/Картинки, чтобы получить путь к хранилищу фотографий.
для уровня API > 7 используйте getExternalStoragePublicDirectory (DIRECTORY_PICTURES).
Я знаю, что мой вопрос - это дубликат этого вопроса и этот. Но все-таки у меня есть некоторые проблемы, поэтому не пытайтесь закрыть или опробовать моих друзей. Пожалуйста, полностью изучите вопрос.
В моем приложении я хочу хранить изображения в той же папке, где хранится их собственная камера. Согласно моим исследованиям, я обнаружил, что каждое устройство сохраняет изображения в другом имени и в разных папках.
То есть:
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) я узнал, что создается только папка, но изображение сохраняется в своем месте по умолчанию с собственным именем.
Как решить эту проблему? Невозможно найти конкретный путь и имя изображения, которое будет сохранено для каждого устройства? Пожалуйста, помогите мне с друзьями.
Используйте getExternalStorageDirectory(), если уровень API ниже 7, а затем добавьте/Картинки, чтобы получить путь к хранилищу фотографий.
для уровня API > 7 используйте getExternalStoragePublicDirectory (DIRECTORY_PICTURES).
Я использую следующий код
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();
}
Это функция, которую я использую. Он специально не определяет каталоги 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());
}
}
}
}
Я сам искал решение этой проблемы. Поскольку у разных производителей есть соглашения об именах для разных камер для папок с камерами, это, по-видимому, покрывает всю землю лучше всего. Это работает для меня довольно хорошо.