Trigger mediascanner для старых и новых устройств Android (ниже и выше kitkat)

Как я могу разместить код Mediascanner здесь? Мне нужно показать изображения в галерее. Перепробовал так много решений, но ничего не получалось. Будет полезен пример с данным кодом:

      public void SaveImage(Bitmap bitmap)
      {
      final File myDir = new File(
           Environment
         .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),

     pref.getGalleryName());


     myDir.mkdirs();
     // fix
     myDir.setExecutable(true);
     myDir.setReadable(true);
     myDir.setWritable(true);

     Random generator = new Random();
     int n = 100000;
     n = generator.nextInt(n);

     final String fname = "Filename" + n + ".jpg";
     File file = new File(myDir, fname);
     if (file.exists())
        file.delete();
      try 
       {

       FileOutputStream out = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        out.flush();
        out.close();
        Toast.makeText(
                _context,
                _context.getString(R.string.toast_saved).replace("#",
                        "\"" + pref.getGalleryName() + "\""),
                Toast.LENGTH_SHORT).show();
        Log.d(TAG, "Image saved to: " + file.getAbsolutePath());

      } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(_context,
                _context.getString(R.string.toast_saved_failed),
                Toast.LENGTH_LONG).show();

       }
    }

}

1 ответ

Решение

Мы не можем напрямую вызывать медиа-сканер после версии kitkat, она ограничена только системными приложениями. Для обновления содержимого в галерее вам необходимо напрямую обновить базу данных медиастазы галереи с требуемым именем файла. Это то, что я сделал, чтобы преодолеть проблему. Этот метод также эффективнее, чем Mediascanner, потому что метод Mediascanner требует много ресурсов процессора. Mediascanner в основном ищет мультимедийный контент во всех наших хранилищах, что может снизить производительность устройства.

public void saveImageToSDCard(Bitmap bitmap)
    {
        final File myDir = new File(  
         Environment
         .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
         pref.getGalleryName());
        myDir.mkdirs();
        Random generator = new Random();
        int n = 100000;
        n = generator.nextInt(n);
        final String fname = "File" + n + ".jpg";
        File file = new File(myDir, fname);
        if (file.exists())
            file.delete();
        try {
            FileOutputStream out = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
            out.flush();
            out.close();
            Toast.makeText(
                    _context,
                    _context.getString(R.string.toast_saved).replace("#",
                            "\"" + pref.getGalleryName() + "\""),
                    Toast.LENGTH_SHORT).show();
            Log.d(TAG, "Image saved to: " + file.getAbsolutePath());

// follow from here onwards

            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.DATA,file.getAbsolutePath());
            values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpeg");
            _context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);

        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(_context,
                    _context.getString(R.string.toast_saved_failed),
                    Toast.LENGTH_LONG).show();

        }

    }
Другие вопросы по тегам