Scannez la carte SD Android pour les nouveaux fichiers
Mon application permet à un utilisateur d'enregistrer une image sur leur carte SD. Mais je ne suis pas sûr de savoir comment le faire apparaître dans la galerie jusqu'à ce que vous les démonter et de remonter la carte SD. J'ai googlé pour un couple de jours avec ce problème, mais je suis pas sûr de savoir comment faire apparaître automatiquement. J'ai trouvé
cette lien, mais je ne suis pas sûr de savoir comment utiliser la classe. C'est ce que j'utilise pour enregistrer le fichier. Au bas de l'essayer bloc catch est là où je veux scan de la carte sd pour les nouveaux médias.
FileOutputStream outStream = null;
File file = new File(dirPath, fileName);
try {
outStream = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.flush();
outStream.close();
} catch {
...
}
Si quelqu'un pouvait me diriger dans la bonne direction, j'apprécierais.
source d'informationauteur Brian
Vous devez vous connecter pour publier un commentaire.
J'ai essayé beaucoup de différentes méthodes pour déclencher la MediaScanner, et ce sont mes résultats.
SendBroadcast
Le plus simple et naïf solution. Elle consiste dans l'exécution de l'instruction suivante à partir de votre code:
Cependant, cette ne fonctionne plus dans KitKat périphériques, en raison d'un manque d'autorisations requises.
MediaScannerWrapper
Posté ici (par @Brian de réponse), il consiste en l'enveloppant d'un
MediaScannerConnection
exemple dans le but de déclencher lascan()
méthode sur un répertoire spécifique. Cette méthode a prouvé à être fonctionne bien pour la 4.3 et au-dessous, mais toujours pas de chance avec KitKat (4.4+).FileWalker
L'un des nombreux Play Store apps qui tente de surmonter la MediaStore le manque d'engagement de mettre à jour sa base de données est ReScan SD. Il envoie beaucoup de différentes émissions:
et essaie de les soutenir KitKat manuellement par le déclenchement de la
scan()
méthode sur chaque fichier du répertoire de base. Malheureusement, c'est à la fois très gourmand en temps PROCESSEUR et de temps, de sorte qu'il n'est pas très recommandé."La coquille chemin"
La seule chose qui semble plus fonctionner avec KitKat, dans certains cas, est l'envoi de la diffusion par les
adb shell
. Ainsi, cet extrait permet de le faire par programmation:Il est plus d'un hack-ish façon de le faire, mais en ce moment est le mieux que je pouvais venir.
Ligne de fond
Chacune des solutions ci-dessus ne fonctionne réellement pour tout ce qui n'est pas de KitKat. C'est parce que, grâce à Justinun bug a été découvert et publié à la officiel Tracker. Cela signifie que, jusqu'à ce que le bug est repassé, on se retrouve avec aucun vrai KitKat soutien.
Lequel utiliser? Parmi ceux-ci, je voudrais utiliser le
MediaScannerWrapper
solution, en collaboration avec leshell-ish
approche (la dernière).Depuis la dernière réponse que j'ai posté, apparemment, n'était pas une méthode appropriée, j'ai trouvé une autre méthode ici. En gros, vous créez une classe wrapper, l'initialiser, puis d'appeler le scan() la méthode. Très utile post. Laissez-moi savoir si ce n'est pas appropriée.
Utilisation MediaScannerConnection:
http://developer.android.com/reference/android/media/MediaScannerConnection.html
Il peut être un peu une douleur en raison des multiples niveaux d'appels asynchrones, ainsi que des API 8 (Froyo) il existe une fonction d'assistance:
http://developer.android.com/reference/android/media/MediaScannerConnection.html#scanFile(android.content.Contextjava.lang.String[], java.lang.String[], android.médias.MediaScannerConnection.OnScanCompletedListener)
Vous pouvez aussi appeler des médias scanner explicitement par l'envoi de diffusion.
Vous pouvez utiliser
MediaStore.Images.Media.insertImage
pour insérer un élément dans la galerie.Ici est une autre façon de forcer l'analyse:
Et puis, système d'incendie ACTION_MEDIA_SCANNER_FINISHED de diffusion de sorte que vous pouvez réagir sur elle avec BroadcastReceiver
Afin d'être en mesure de recevoir ACTION_MEDIA_SCANNER_FINISHED de diffusion, filtre d'intention doit contenir des données:
de la doc:
et