Как создать папку изображений приложения для отображения в галерее Android
У меня есть приложение, в котором пользователь создает изображение, а затем я хочу сохранить его так, чтобы он отображался в приложении галереи по умолчанию.
Теперь я не хочу, чтобы фотографии сохранялись в той же папке, что и фотографии, сделанные с камеры, я хочу, чтобы они были сохранены в папке, предназначенной для приложения, так же, как изображения из приложений, таких как WhatsApp или Facebook.
Я попытался сохранить их в этих двух местах:
File imagePath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)+ File.separator + appDirectoryName + File.separator);
и здесь
File imagePath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+ File.separator + appDirectoryName + File.separator);
Если я просматриваю телефон, я вижу, что я успешно сохраняю изображения, но они не отображаются в приложении галереи. Очевидно, что я что-то упускаю, но не знаю, что это. Может быть, добавить какие-то метаданные в файлы или папки, чтобы галерея узнала их?
Ответы
Ответ 1
Ну, я нашел ответ в конце.
Это оказалось тем, что я подозревал. Сохраненное изображение должно содержать некоторые метаданные, которые можно увидеть в галерее (по крайней мере, на моем устройстве).
Это то, что я сделал:
OutputStream fOut = null;
File file = new File(imagePath,"GE_"+ System.currentTimeMillis() +".jpg");
try {
fOut = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
try {
fOut.flush();
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
ContentValues values = new ContentValues();
values.put(Images.Media.TITLE, this.getString(R.string.picture_title));
values.put(Images.Media.DESCRIPTION, this.getString(R.string.picture_description));
values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis ());
values.put(Images.ImageColumns.BUCKET_ID, file.toString().toLowerCase(Locale.US).hashCode());
values.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, file.getName().toLowerCase(Locale.US));
values.put("_data", file.getAbsolutePath());
ContentResolver cr = getContentResolver();
cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Ответ 2
Попробуй это
private void createDirectoryAndSaveFile (Bitmap imageToSave, String fileName) {
File direct = new File(Environment.getExternalStorageDirectory() + "/DirName");
if (!direct.exists()) {
File wallpaperDirectory = new File("/sdcard/DirName/");
wallpaperDirectory.mkdirs();
}
File file = new File(new File("/sdcard/DirName/"), fileName);
if (file.exists())
file.delete();
try {
FileOutputStream out = new FileOutputStream(file);
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Ответ 3
У меня была такая же проблема. Второй способ - правильный путь, но вы не видите изображения в Галерее, потому что галерея нуждается в обновлении. Итак, вы можете подождать некоторое время, пока оно не обновится, или вы можете использовать MediaScanner - посмотрите здесь
Надеюсь, это помогло!
Ответ 4
Я сделал следующее, чтобы заставить его работать:
public void galleryAddPic() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_MOUNTED);
String mCurrentPhotoPath = "file:" + image.getAbsolutePath(); // image is the created file image
File file = new File(mCurrentPhotoPath);
Uri contentUri = Uri.fromFile(file);
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);
}
Ответ 5
Я попробовал это, он отлично работает.
private Uri imageUri;
String getimgname, getimgpath;
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photo = new File(Environment.getExternalStorageDirectory(), "IMG"+System.currentTimeMillis()+".jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photo));
imageUri = Uri.fromFile(photo);
getimgname = photo.getName();
getimgpath = photo.getAbsolutePath();
Ответ 6
Попробуй это
MediaScannerConnection.scanFile(context,
new String[] { file.toString() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});