Медиасервер в моем стоковом и корневом Android 6.0.1 (работающем в Nexus 6) не обнаруживает новые файлы, созданные или перемещенные в /sdcard с помощью adb. Он не обнаруживает, пока я не выполню мягкую / полную перезагрузку, которую я считаю неприемлемой.
Я могу вручную запустить медиасервер с помощью командной строки, чтобы снова начать сканирование файлов, # и я хочу, чтобы это выполнялось автоматически и немедленно всякий раз, когда в /sdcard создается новый файл . На данный момент у меня Tasker запускает медиасервер всякий раз, когда USB-кабель отключен. *
Очевидным выбором здесь, кажется, является приложение для автоматизации, из которых я пробовал Tasker и Automate , и оба удивительно не смогли обнаружить новые файлы, особенно в /sdcard/Music, при создании через adb. Однако, если приложение создавало файлы в любом каталоге в /sdcard , эти два приложения немедленно обнаруживали изменения. Я также попытался отправить файлы в /storage/emulated/0/ вместо /sdcard/ и внес соответствующие изменения в триггеры этих двух приложений. Этот шаг мне не помог.
Следует отметить, что я наблюдал эту проблему в стандартной версии Android 5.1.1, а также в сборке моментального снимка CM13.
Итак, как мне достичь цели?
Я знаю о возможности создания псевдонима в ОС, работающей на моем ПК, который будет выполнять сценарий, обеспечивающий способ отправки файла, а также запуска медиасервера. Тем не менее, это то, чего я хотел бы избежать, насколько это возможно.
* Я использовал его, но позже переключился на скрипт, запускаемый с ПК с помощью псевдонима. Однако я не хочу зависеть ни от одного из двух методов . Моим пальцам удобно набирать adb push вместо adb_push или какого-то другого, кроме одного слова.
adb push FILE /sdcard/FILE
, медиасервер должен автоматически и немедленно включаться и сканировать файл. Независимо от какой-либо ощутимой проблемы с производительностью, я хочу, чтобы она срабатывала каждый раз.Хорошо, я могу использовать неправильный термин . Возможно , медиасервер и медиасканер — это две разные вещи в Android. В случае путаницы, пожалуйста, придерживайтесь «медиа сканера» как для текущей версии, так и для примечания к награде.
# Любезно предоставлено androidyue для этого полезного ресурса , любая из следующих команд в предварительно отформатированном тексте - это то, что я могу использовать на своем устройстве, чтобы сканер мультимедиа сканировал файл.
# FILE_PATH относится к местоположению загруженного файла в Android. Например, /sdcard/Музыка/lolcat.mp3 я транслировал -a android.intent.action.BOOT_COMPLETED -n com.android.providers.media/.MediaScannerReceiver am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file://FILE_PATH # гарантированно работает. См. https://goo.gl/lH0CLT для доказательства. трансляция -a android.intent.action.MEDIA_MOUNTED -d file://FILE_PATH
По предложению Манубхаргава я попробовал MTPFix Сарки, доступный здесь . Не получилось, как на стоковом Android 6.0.1, так и на CM13. Я увидел следующую запись, когда включил службу для этого приложения.
04-07 09:38:14.771 3383 3383 I MTPService: Watching /storage/emulated/0
Позже я засунул звуковой файл в /storage/emulated/0/ , и в моем музыкальном проигрывателе ничего не появилось. Logcat также не показал ничего полезного.
Кстати, это приложение использует FileObserver , поэтому я не удивлюсь, если оно не сможет обнаружить файлы, созданные с помощью adb, поскольку это та же проблема с приложениями автоматизации, которые я пробовал.
Примечание. Пожалуйста, публикуйте ответ только тогда, когда вы проверили его самостоятельно. Спасибо!
Хорошо, кажется, ответ тривиален. Моим пальцам не придется терять удобство набора текста adb push
, но я смогу заставить медиа-сканер автоматически и немедленно сканировать мой загруженный файл . Вот мой скрипт, настроенный под мои нужды:
( Примечание : root-доступ не требуется в Android)
#!/бин/баш функция push_file () { цель="${@: -1}"; file_path="${@: -2:1}"; [[ "$prog_bar" == "-p" ]] && adb "$@" || $call_adb push -p "$file_path" "$target"; } трансляция функции () { file_name="$(базовое имя "$file_path")"; [[ `echo "${target: -1}"` != "/" ]] && unset file_name; [[ `echo "${target:0:1}"` != "/" ]] && target="/${target}"; $call_adb shell 'в эфире -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d '"\"file://$target$file_name\""'' > /dev/null; } если [[ "$1" == "-s" ]]; затем если [[ "$3" == "push" ]]; затем прог_бар = "$4"; call_adb="adb -s $2"; push_file "$@" && широковещательный; еще adb "$@"; фи elif [[ "$1" == "push" ]]; затем прог_бар = "$2"; call_adb="adb"; push_file "$@" && широковещательный; еще adb "$@"; фи
Затем я устанавливаю псевдоним adb в .bashrc следующим образом:
alias adb='bash FILE' # FILE refers the file path of the said script
Это стало возможным благодаря очень полезной статье: Обработка позиционных параметров на Bash Hackers Wiki.
Примечание : для сценария более или менее требуется ОС на базе *nix на ПК с установленной версией 4.x Bash и поддержкой .bashrc . Если вы собираетесь использовать сценарий, рекомендуется отредактировать его в соответствии с вашим стилем работы.
Я не уверен, как именно работает медиа-сканер, я думаю, что медиа-сканер постоянно обновляет папку «Загрузки» во внутреннем хранилище...
если что-то не отображается в другой папке, я копирую это в папку загрузки, и это запускает медиа-сканер...
Попробуйте использовать папку загрузки во внутреннем хранилище в качестве абсолютного пути.
adb push FILE /sdcard/DIR/
медиасервер должен включиться и просканировать файл.
акеджавелин
Повелитель огня
Манубхаргав