52

我正在使用 adb 在安卓手机上同步音乐。本质上,我 rm 现有的音乐目录并推送替换音乐文件。

我希望能够使用 adb 强制重新扫描,以便谷歌音乐播放器(和其他应用程序)与新歌曲和播放列表正常工作。

根据如何在 Android 上刷新 MediaStore?您可以通过广播适当的意图来强制重新扫描。

adb 提供“shell am broadcast”,这似乎允许我从 adb 强制重新扫描。

或者,我可以运行重新扫描应用程序或重新启动,但我想从 adb 触发重新扫描

我应该发出什么 adb 命令?音乐文件和播放列表都在 /sdcard/music 中。

4

5 回答 5

55

重新扫描应用程序使用媒体装载意图来启动媒体扫描仪。您可以使用am broadcast来发送相同的意图。

命令是:

adb shell am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///sdcard
于 2013-10-17T19:53:46.410 回答
30

非系统应用不再允许 MEDIA_MOUNTED 意图(发布 KitKat);试试这个。

但是,它不是递归的,并且必须在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"
于 2017-05-10T21:18:42.683 回答
2

在某些三星手机上,您可以像这样进行全面重新扫描:

am broadcast -a com.samsung.intent.action.MTP_FILE_SCAN -n com.android.providers.media/.MediaScannerReceiver
于 2019-01-26T10:17:51.250 回答
1

如果你已经root了你的手机,你可以使用我写的这个脚本,它的优点是可以跟踪哪些文件已经被更新:

#!/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"
于 2018-08-10T18:55:21.980 回答
1

这是一个名为adb-scan. 它用于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)
于 2019-10-29T13:08:18.873 回答