使用adb刷新Android媒体商店

ma8fv8wu  于 2023-10-14  发布在  Android
关注(0)|答案(6)|浏览(171)

我在android手机上用adb同步音乐。本质上,我rm现有的音乐目录和推动更换音乐文件。
我希望能够使用adb来强制重新扫描,这样google music player(和其他应用程序)就可以正常使用新歌和播放列表了。
根据How can I refresh MediaStore on Android?,您可以通过广播适当的Intent来强制重新扫描。
adb提供了“shell am broadcast”,这似乎允许我从adb强制重新扫描。
或者我可以运行一个重新扫描应用程序或重新启动,但我想从亚行触发重新扫描
我应该发出什么adb命令?音乐文件和播放列表都在/sd卡/音乐。

cgyqldqp

cgyqldqp1#

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

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

kmbjn2e32#

不再允许非系统应用程序使用MEDIA_MOUNTED Intent(发布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"
0mkxixxg

0mkxixxg3#

在一些三星手机上,你可以像这样获得完整的重新扫描:

am broadcast -a com.samsung.intent.action.MTP_FILE_SCAN -n com.android.providers.media/.MediaScannerReceiver
wlp8pajw

wlp8pajw4#

如果你已经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"
wwwo4jvm

wwwo4jvm5#

下面是一个名为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)
n7taea2i

n7taea2i6#

在较新版本的Android中,您可以使用content call来调用scan_volume方法,以实现以下目标:

adb shell content call --method scan_volume --uri content://media --arg external_primary
  • --method scan_volume是调用inside MediaStore的方法
  • --uri content://media指的是内容提供商授权,在本例中为MediaStore.AUTHORITY
  • --arg external_primary是指Environment.getExternalStorageDirectory()返回的卷的名称

要验证它是否有效,您可以使用logcat:

adb logcat -s MediaProvider

这反过来又显示了类似于:

10-10 10:33:57.522  3261  3295 I MediaProvider: Scanned external_primary due to REASON_DEMAND, found 46 items in 325ms, 0 inserts 20 updates 0 deletes

相关问题