Android: rafraîchir la galerie après avoir enregistré de nouvelles images
Donc, dans mon application j'ai un point d'enregistrer un tas d'images dans un dossier temporaire, et je veux à apparaître immédiatement dans la Galerie. Après un redémarrage, ils le font, mais autrement ils ne le font pas.
j'ai essayé d'utiliser la méthode sendBroadcast:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
Mais j'obtiens une erreur de permission:
E/AndroidRuntime( 2628): java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=2628, uid=10068
est-ce que je pourrais manquer une permission dans mon AndroidManifest, ou est-ce que ce n'est plus supporté? Merci
7 réponses
Essayez ceci, Ça fonctionne pour moi sur Kitkat (4.4) https://stackoverflow.com/a/5814533/640528
MediaScannerConnection.scanFile(this, new String[] { Environment.getExternalStorageDirectory().toString() }, null, new MediaScannerConnection.OnScanCompletedListener() {
/*
* (non-Javadoc)
* @see android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String, android.net.Uri)
*/
public void onScanCompleted(String path, Uri uri)
{
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
j'ai essayé Environment.getExternalStorageDirectory().toString()
, mais il n'a pas trouver mon dossier personnalisé.
je voulais juste partager mon expérience pour résoudre ce problème.
À la fin, j'ai eu MediaScannerConnection
configuré pour numériser un fichier à la fois et maintenant le dossier manquant qui contenait ces images s'est montré. Chaque fois que je télécharge chaque image, j'appelle MediaScannerConnection
et le chemin du fichier comme Uri au lieu du dossier lui-même.
aussi, beaucoup de gens ont demandé pourquoi sendBroadcast
arrêtez de travailler sur kitkat et la réponse est que sendBroadcast
a été abusé et appelé trop souvent et causant système de vidange de la batterie ou ralentissement, de sorte qu'ils ont supprimé l'appel direct pour prévenir l'abus qui a du sens. J'espérais utiliser la solution ci-dessus pour le dossier qui contient toutes les images, mais cela n'a pas fonctionné sur le dossier. J'espérais que le fait de trouver le dossier exposerait reste des fichiers dans le dossier personnalisé, mais il n'a pas dans mon cas. J'espère trouver une meilleure réponse à l'avenir...
voici un extrait de mon code.
MediaScannerConnection.scanFile(ApplicationContext.context, new String[] { imageFile.getPath() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
Log.i(TAG, "Scanned " + path);
}
});
Essayez celui-ci: après avoir enregistré votre fichier dans le dossier,écrivez le code ci-dessous
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("your image path"))));
implémenter Médiascannerconnectionclient et ajouter le code ci-dessous.Fonctionne parfaitement en 4.4 :)
MediaScannerConnection conn;
public void startScan(String url) {
imagepath = url;
if (conn != null)
conn.disconnect();
conn = new MediaScannerConnection(activity.this, activity.this);
conn.connect();
}
@Override
public void onMediaScannerConnected() {
try {
conn.scanFile(imagepath, getMimeType(imagepath));
} catch (java.lang.IllegalStateException e) {
//Do something
}
}
@Override
public void onScanCompleted(String path, Uri uri) {
conn.disconnect();
}
je sais que sa fin mais essayez ceci peut travailler dans toutes les versions:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Intent mediaScanIntent = new Intent(
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(out); //out is your file you saved/deleted/moved/copied
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
} else {
sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
}
ci-dessous le travail de code tout le dispositif pour rafraîchir la galerie après avoir sauvé l'image.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f1 = new File("file://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
Uri contentUri = Uri.fromFile(f1);
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);
} else {
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("your image path"))));
Utilisez MediaScannerConnection au lieu de SendBroadcast..
MediaScannerConnection.MediaScannerConnectionClient(
{
@Override
public void onScanCompleted(String path, Uri uri) {
if (path.equals(**your filename**.getAbsolutePath()))
{
Log.i("Scan Status", "Completed");
Log.i("uri: ",uri.toString());
conn.disconnect();
}
}
@Override
public void onMediaScannerConnected()
{
// TODO Auto-generated method stub
conn.scanFile(**your file name**.getAbsolutePath(),null);
}
});
conn.connect();