Как создать папку изображений приложения для отображения в галерее 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);
                    }
                });