Saya menyimpan gambar ke sdcard dan itu tidak muncul di aplikasi Galeri sampai saya menarik kartu sd dan mengembalikannya kembali.
Apakah Anda tahu mengapa demikian?
Sepertinya aplikasi Galeri memiliki beberapa cache yang tidak diperbarui pada penyimpanan file ...
Sebenarnya, saya juga ingin membuka gambar yang baru saja disimpan di aplikasi Galeri dan tidak berhasil dengan itu,
inilah pertanyaan saya tentang masalah ini.
Jawaban:
Sistem memindai kartu SD saat dipasang untuk menemukan file gambar baru (dan lainnya). Jika Anda menambahkan file secara terprogram, Anda dapat menggunakan kelas ini:
http://developer.android.com/reference/android/media/MediaScannerConnection.html
sumber
Solusi yang lebih sederhana adalah dengan menggunakan metode kemudahan statis scanFile () :
File imageFile = ... MediaScannerConnection.scanFile(this, new String[] { imageFile.getPath() }, new String[] { "image/jpeg" }, null);
di mana
this
aktivitas Anda (atau konteks apa pun), jenis mime hanya diperlukan jika Anda menggunakan ekstensi file non-standar dannull
is untuk callback opsional (yang tidak kami perlukan untuk kasus sederhana seperti itu).sumber
Jawaban saya atas pertanyaan awal dan kepada siapa pun yang mungkin memiliki masalah ini:
Saya mengalami masalah yang sama, gambar di aplikasi saya yang disimpan orang ke kartu SD tidak segera muncul di Galeri mereka. Setelah beberapa pencarian, saya menemukan satu baris kode ini dimasukkan setelah kode 'simpan ke sdcard' saya yang memperbaiki masalah:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
sumber
Anda juga bisa menambahkan Gambar ke Galeri Media dengan sengaja, lihat kode contoh untuk melihat bagaimana hal itu dilakukan:
ContentValues image = new ContentValues(); image.put(Images.Media.TITLE, imageTitle); image.put(Images.Media.DISPLAY_NAME, imageDisplayName); image.put(Images.Media.DESCRIPTION, imageDescription); image.put(Images.Media.DATE_ADDED, dateTaken); image.put(Images.Media.DATE_TAKEN, dateTaken); image.put(Images.Media.DATE_MODIFIED, dateTaken); image.put(Images.Media.MIME_TYPE, "image/png"); image.put(Images.Media.ORIENTATION, 0); File parent = imageFile.getParentFile(); String path = parent.toString().toLowerCase(); String name = parent.getName().toLowerCase(); image.put(Images.ImageColumns.BUCKET_ID, path.hashCode()); image.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, name); image.put(Images.Media.SIZE, imageFile.length()); image.put(Images.Media.DATA, imageFile.getAbsolutePath()); Uri result = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image);
sumber
Uri
tetapi masalahnya adalah gambar yang dimasukkan tidak muncul di galeri. Saya telah memeriksa baik di awal maupun di akhir galeri. Bisakah Anda menyarankan metode apa pun sehingga gambar yang disisipkan harus segera ditampilkan di galeri?Penyegaran galeri termasuk Android KITKAT
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File f = new File("file://"+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); this.sendBroadcast(mediaScanIntent); } else { sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); }
sumber
Berikut adalah kode untuk MediaScannerConnection:
MyMediaConnectorClient client = new MyMediaConnectorClient(newfile); MediaScannerConnection scanner = new MediaScannerConnection(context, client); client.setScanner(scanner); scanner.connect();
newfile adalah objek File dari file baru / tersimpan Anda.
sumber
MyMediaConnectorClient
...ada aplikasi di emulator yang bertuliskan - 'Dev Tools'
klik itu dan pilih 'Media Scanning' .. semua gambar akan dipindai
sumber
Biarkan aktivitas Anda mengimplementasikan 'MediaScannerConnectionClient' dan menambahkan ini ke aktivitas Anda:
private void startScan() { if(conn!=null) conn.disconnect(); conn = new MediaScannerConnection(YourActivity.this,YourActivity.this); conn.connect(); } @Override public void onMediaScannerConnected() { try{ conn.scanFile(yourImagePath, "image/*"); } catch (java.lang.IllegalStateException e){ } } @Override public void onScanCompleted(String path, Uri uri) { conn.disconnect(); }
sumber
Uri
gambarnya, misalnya:content://media/external/images/media/1231778
ini bekerja dengan saya
File file = ..... // Save file context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
sumber
File folderGIF = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/newgif2"); //path where gif will be stored success = folderGIF.mkdir(); //make directory String finalPath = folderGIF + "/test1.gif"; //path of file ..... /* changes in gallery app if any changes in done*/ MediaScannerConnection.scanFile(this, new String[]{finalPath}, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { Log.i("ExternalStorage", "Scanned " + path + ":"); Log.i("ExternalStorage", "-> uri=" + uri); } });
sumber
Di sini saya membagikan kode yang dapat memuat gambar dalam bentuk bitmap dari dan menyimpan gambar itu di galeri sdcard di folder nama aplikasi. Anda harus mengikuti langkah-langkah ini
private Bitmap loadBitmap(String url) { try { InputStream in = new java.net.URL(url).openStream(); return BitmapFactory.decodeStream(in); } catch (Exception e) { e.printStackTrace(); } return null; }
uses-permission android:name="android.permission.INTERNET" uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
void saveMyImage(String appName, String imageUrl, String imageName) { Bitmap bmImg = loadBitmap(imageUrl); File filename; try { String path1 = android.os.Environment.getExternalStorageDirectory() .toString(); File file = new File(path1 + "/" + appName); if (!file.exists()) file.mkdirs(); filename = new File(file.getAbsolutePath() + "/" + imageName + ".jpg"); FileOutputStream out = new FileOutputStream(filename); bmImg.compress(Bitmap.CompressFormat.JPEG, 90, out); out.flush(); out.close(); ContentValues image = new ContentValues(); image.put(Images.Media.TITLE, appName); image.put(Images.Media.DISPLAY_NAME, imageName); image.put(Images.Media.DESCRIPTION, "App Image"); image.put(Images.Media.DATE_ADDED, System.currentTimeMillis()); image.put(Images.Media.MIME_TYPE, "image/jpg"); image.put(Images.Media.ORIENTATION, 0); File parent = filename.getParentFile(); image.put(Images.ImageColumns.BUCKET_ID, parent.toString() .toLowerCase().hashCode()); image.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, parent.getName() .toLowerCase()); image.put(Images.Media.SIZE, filename.length()); image.put(Images.Media.DATA, filename.getAbsolutePath()); Uri result = getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image); Toast.makeText(getApplicationContext(), "File is Saved in " + filename, Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); } }
sumber
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Sepertinya tidak berfungsi di KITKAT. Itu melempar pengecualian penolakan izin dan membuat aplikasi crash. Jadi untuk ini, saya telah melakukan hal berikut,
String path = mediaStorageDir.getPath() + File.separator + "IMG_Some_name.jpg"; CameraActivity.this.sendBroadcast(new Intent( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri .parse("file://" + path)));
Semoga membantu.
sumber
Gunakan ini setelah menyimpan gambar
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
sumber
Kode saya untuk MyMediaConnectorClient:
public class MyMediaConnectorClient implements MediaScannerConnectionClient { String _fisier; MediaScannerConnection MEDIA_SCANNER_CONNECTION; public MyMediaConnectorClient(String nume) { _fisier = nume; } public void setScanner(MediaScannerConnection msc){ MEDIA_SCANNER_CONNECTION = msc; } @Override public void onMediaScannerConnected() { MEDIA_SCANNER_CONNECTION.scanFile(_fisier, null); } @Override public void onScanCompleted(String path, Uri uri) { if(path.equals(_fisier)) MEDIA_SCANNER_CONNECTION.disconnect(); } }
sumber
Anda perlu memberikan izin ke aplikasi Galeri. Cukup tekan lama ikon aplikasi galeri di layar beranda dan ketuk 'INFO APLIKASI' yang muncul di bagian atas layar. Setelah itu, pengaturan aplikasi galeri akan ditampilkan. Sekarang masuk ke tab Izin dan aktifkan penyimpanan, izin kamera dengan mengaktifkannya. Sekarang buka aplikasi galeri asli Anda dan Anda akan mendapatkan gambar yang disimpan.
sumber
Ini juga akan menyelesaikan masalah Anda jika gambar Anda di galeri tidak muncul, tetapi gambar tersebut mungkin menampilkan bitmap tipe 404 di tengah. tolong tambahkan tag yang ada di kode saya dengan gambar Anda karena harus ada beberapa data meta untuk menampilkan gambar di galeri.
String resultPath = getExternalFilesDir(Environment.DIRECTORY_PICTURES)+ getString(R.string.directory) + System.currentTimeMillis() + ".jpg"; new File(resultPath).getParentFile().mkdir(); try { OutputStream fileOutputStream = new FileOutputStream(resultPath); savedBitmap.compress(CompressFormat.JPEG, 100, fileOutputStream); fileOutputStream.flush(); fileOutputStream.close(); } catch (IOException e2) { e2.printStackTrace(); } savedBitmap.recycle(); File file = new File(resultPath); ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.TITLE, "Photo"); values.put(MediaStore.Images.Media.DESCRIPTION, "Edited"); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis ()); values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis()); values.put(MediaStore.Images.ImageColumns.BUCKET_ID, file.toString().toLowerCase(Locale.US).hashCode()); values.put(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, file.getName().toLowerCase(Locale.US)); values.put("_data", resultPath); ContentResolver cr = getContentResolver(); cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); return resultPath;
sumber
Coba yang ini, itu akan menyiarkan tentang gambar baru yang dibuat, sehingga gambar Anda terlihat. di dalam galeri. photoFile diganti dengan jalur file sebenarnya dari gambar yang baru dibuat
private void galleryAddPicBroadCast() { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri contentUri = Uri.fromFile(photoFile); mediaScanIntent.setData(contentUri); this.sendBroadcast(mediaScanIntent); }
sumber