我正在使用adb在Android手机上同步音乐。基本上,我是现有的音乐目录并推送替换音乐文件。
我希望能够使用adb强制进行重新扫描,以便Google音乐播放器(以及其他应用)与新歌曲和播放列表一起正常工作。
根据How can I refresh MediaStore on Android?,您可以通过广播适当的意图强制重新扫描。
adb提供'shell am broadcast',这似乎允许我强制从adb重新扫描。
或者我可以运行重新扫描应用程序或重新启动,但我想从adb触发重新扫描
我应该发出什么adb命令?音乐文件和播放列表都在/ sdcard / music中。
答案 0 :(得分:53)
重新扫描应用程序使用媒体装载意图启动媒体扫描程序。您可以使用am broadcast
发送相同的意图。
命令是:
adb shell am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///sdcard
答案 1 :(得分:18)
对于非系统应用程序,不再允许(发布KitKat)MEDIA_MOUNTED意图;试试这个。
但它不是递归的,必须在exact_file_name上运行,因此它不是一个好的替代品。
adb shell am broadcast \
-a android.intent.action.MEDIA_SCANNER_SCAN_FILE \
-d file:///mnt/sdcard/Music/<exact_file_name>
如果需要递归重新扫描,可以使用此命令(相应地修复路径):
adb shell "find /mnt/sdcard/Music/ -exec am broadcast \
-a android.intent.action.MEDIA_SCANNER_SCAN_FILE \
-d file://{} \\;"
或者像这样(如果上面不适合你):
adb shell "find /mnt/sdcard/Music/ | while read f; do \
am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE \
-d \"file://${f}\"; done"
答案 2 :(得分:1)
在某些三星手机上,您可以像这样进行全面的重新扫描:
am broadcast -a com.samsung.intent.action.MTP_FILE_SCAN -n com.android.providers.media/.MediaScannerReceiver
答案 3 :(得分:0)
如果您已扎根手机,则可以使用我编写的以下脚本,该脚本的优点是可以跟踪已更新的文件:
#!/system/bin/env busybox ash
MUSIC_LIBRARY=/sdcard/MusicLibrary
LAST_UPDATE="$(stat -c %Y "$MUSIC_LIBRARY/.last-update")"
find "$MUSIC_LIBRARY" -type f ! -iname ".last-update" | (
while read f; do
if ! test "$LAST_UPDATE" -ge "$(stat -c %Y "$f")"; then
am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d "file://$f"
touch "$f"
else
echo "Not updated: \`$f'"
fi
done
)
touch "$MUSIC_LIBRARY/.last-update"
答案 4 :(得分:0)
这是一个名为adb-scan
的Python脚本。
它使用adb
要求Android设备重新扫描给定的文件。
用法示例:
$ adb-scan Notifications/\*.mp3
Broadcasting: Intent { act=android.intent.action.MEDIA_SCANNER_SCAN_FILE dat=file:///sdcard/Notifications/cough.mp3 flg=0x400000 }
Broadcast completed: result=0
Broadcasting: Intent { act=android.intent.action.MEDIA_SCANNER_SCAN_FILE dat=file:///sdcard/Notifications/harmonica3.mp3 flg=0x400000 }
Broadcast completed: result=0
Broadcasting: Intent { act=android.intent.action.MEDIA_SCANNER_SCAN_FILE dat=file:///sdcard/Notifications/shhh.mp3 flg=0x400000 }
Broadcast completed: result=0
$
这是脚本:
#!/usr/bin/python3
#
# Ask the Android media scanner to check the given files.
#
import sys
import os
import re
sys.argv.pop(0)
if not sys.argv:
sys.exit('usage: adb-scan files...')
intent = 'android.intent.action.MEDIA_SCANNER_SCAN_FILE'
# Quote certain special characters such as spaces, backslashes and quotes. In
# particular, don't quote '*' because we want that to be expanded on the
# Android device.
def cleanup(arg):
if not arg.startswith('/'):
arg = '/sdcard/' + arg
arg = re.sub("[ \\'\"]", lambda x: '\\' + x.group(0), arg)
return arg
script = '''
for i in {args}; do
[ -e "$i" ] || echo "warning: no such file: $i"
am broadcast -a "{intent}" -d "file://$i"
done
'''.format(args=' '.join(map(cleanup, sys.argv)),
intent=intent)
cmd = ['adb', 'shell', script]
os.execvp(cmd[0], cmd)