3 votes

Déclencher manuellement MediaScanner pour analyser les fichiers sur le stockage interne sur Nougat/Oreo.

Je gère souvent mes fichiers dans Termux avec des scripts qui utilisent la fonction mv pour les déplacer ou les renommer. Je veux déclencher manuellement le MediaProvider pour qu'il scanne mon stockage interne ( /storage/emulated/0 ) ou un répertoire donné dans celui-ci en ligne de commande, sur un téléphone fonctionnant sous Nougat ou Oreo.

Lorsque j'utilise un gestionnaire de fichiers à interface graphique, tous les déplacements/renommages sont immédiatement répercutés dans d'autres applications dépendant du MediaScanner, comme Gallery, mais les modifications effectuées dans un terminal ne le sont pas, jusqu'à ce que je redémarre. Je dois donc appeler manuellement MediaScanner pour mettre à jour mes modifications dans le système de fichiers.

Avant KitKat, cela fonctionnait bien sur /storage/sdcard0 (une partition séparée nommée glow ) :

am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///sdcard

La commande ci-dessus ne fonctionne plus ( /storage/emulated/0 ), évidemment.

J'ai également essayé ceci, mais cela ne semble pas fonctionner non plus.

am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard

Je viens de tester à nouveau les commandes, elles semblent fonctionner sur les supports de stockage amovibles tels que /storage/sdcard1 , /storage/usba o /storage/{volume id} (il est re-scanné), mais pas la mémoire interne de mon téléphone (où les données sont stockées). /sdcard pointe vers, ou /storage/emulated/0 ).

Quelqu'un a-t-il des idées ? Le redémarrage de mon téléphone provoque toujours un rescan mais c'est peu pratique dans certains cas.

Remarque : les commandes sont exécutées en tant que root, donc pas de problème de permissions.

4voto

Firelord Points 23064

Note : Il est possible que les commandes suivantes ne fonctionnent pas pour vous avec l'utilisateur USB debugging / shell (uID 2000). Dans ce cas, vous devez disposer d'un accès Root pour les faire fonctionner .


Avant KitKat, cela fonctionnait bien :

am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///sdcard

La commande ci-dessus ne fonctionne pas maintenant, évidemment.

Cela fonctionne parfaitement bien sur mon Android 7.1.1 (Nexus 6) qui n'a que le stockage interne. Mais depuis Oreo, les diffusions implicites ne sont pas autorisées Vous devez donc envoyer une diffusion explicite à Media Storage . Ceci peut être fait en utilisant l'argument -n suivi du nom du composant ou simplement de -p suivi du nom du paquet. Sous Android 9.0 (OnePlus 6), voici ce qui a fonctionné pour moi :

am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///sdcard/ -p com.android.providers.media

Je pense que la commande ci-dessus fonctionnerait également pour Android Oreo.

Remarque : shell (utilisateur 2000) ne peut pas exécuter cette commande, vous devez donc élever les privilèges à system (1000) ou Root (0). En bref, exécutez la commande en tant que root ou elle ne fonctionnera pas.


J'ai également essayé ceci, mais cela ne semble pas fonctionner non plus.

am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard

Parce que cette intention attend un FICHIER comme données, pas un répertoire (je comprends que tout est un fichier sous Linux, mais ce n'est pas le cas pour une intention). Fournir le chemin complet d'un fichier et cela fonctionnerait. De plus, comme indiqué plus haut, pour Oreo et les versions supérieures, rendre la diffusion explicite .

Si vous avez plusieurs fichiers et que vous avez l'intention de n'utiliser que cette intention, vous devez récupérer tous les noms de fichiers et les transmettre à l'intention de manière récursive (par Aritra Roy sur Stack Overflow). Il est peut-être possible de passer un tableau mais je ne sais pas comment le faire avec adb.

De plus, mon Android se comportait de manière assez erratique pour les noms de fichiers contenant [] .

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X