Android изображение не было добавлено в галерею, но вызывается OnScanCompletedListener - PullRequest
0 голосов
/ 04 августа 2020

Я создал пример приложения, которое делает снимки и сохраняет их, следуя этому руководству . К сожалению, часть «Добавить фото в галерею» не работает. Я не получаю ошибки в logcat. Изображение просто не видно в галерее. Исходный код:

Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(currentPhotoPath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);

Я попытался решить его, позвонив MediaScannerConnection.scanFile:

MediaScannerConnection.scanFile(
    getApplicationContext(),
    new String[]{f.getAbsolutePath()},
    null,
    new MediaScannerConnection.OnScanCompletedListener() {
        @Override
        public void onScanCompleted(String path, Uri uri) {
            Log.v("MyActivity", "file " + path + " was scanned successfully: " + uri);
        }
    });

Я получаю этот результат в logcat:

file /storage/emulated/0/Android/data/com.example.myapplication/files/Pictures/JPEG_20200804_104708_4760605263689075696.jpg was scanned successfully: content://media/external/file/3524

К сожалению изображение по-прежнему недоступно в галерее. Что я не так? Как можно отладить подобное?

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Вы можете использовать это, чтобы сохранить изображение в галерее, и оно будет видно сразу после сохранения

         String name = "image_name";
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            try {
                ContentResolver resolver = getContentResolver();
                ContentValues contentValues = new ContentValues();
                contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name);
                contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpg");
                contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "Pictures/" + "App Name");
                Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);

                OutputStream outputStream = resolver.openOutputStream(Objects.requireNonNull(imageUri));
                int quality = 100;
                bitmap.compress(Bitmap.CompressFormat.PNG, quality, outputStream);
                outputStream.flush();
                outputStream.close();

                sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, imageUri));
              
                
            }catch (Exception e){
                e.printStackTrace();
                Snackbar.make(v, "Unable to Save image " + e.getMessage(), Snackbar.LENGTH_SHORT).show();
            }

        }else {
            String fullPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/App Name";
            File dir = new File(fullPath);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            File imageFile = new File(fullPath, name);
            FileOutputStream outputStream = new FileOutputStream(imageFile);
            int quality = 100;
            bitmap.compress(Bitmap.CompressFormat.PNG, quality, outputStream);
            outputStream.flush();
            outputStream.close();

            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(imageFile)));
        }
0 голосов
/ 04 августа 2020

Ваша ссылка сообщает вам:

Примечание: если вы сохранили свою фотографию в каталоге, предоставленном getExternalFilesDir (), медиа-сканер не сможет получить доступ к файлам, потому что они являются частными для вашего приложения. ..

Ну, все - до Q- могут получить доступ к этому каталогу, но, очевидно, медиа-сканер закрывает на это глаза.

Но странно, что возвращается uri . Попробуйте открыть.

...