Заставить медиасервер немедленно сканировать файл, созданный через ADB

Медиасервер в моем стоковом и корневом 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 или какого-то другого, кроме одного слова.

Обновление 2

  • Я не собираюсь ограничивать себя определенным каталогом, таким как Download, и никакая передача файлов в последний на самом деле не работает.
  • Я хотел бы подчеркнуть, что я не спрашиваю , как запустить медиасервер . Это я уже знаю. Все, что я ищу, это: всякий раз, когда я это делаю adb push FILE /sdcard/FILE, медиасервер должен автоматически и немедленно включаться и сканировать файл. Независимо от какой-либо ощутимой проблемы с производительностью, я хочу, чтобы она срабатывала каждый раз.

Обновление 3

Хорошо, я могу использовать неправильный термин . Возможно , медиасервер и медиасканер — это две разные вещи в Android. В случае путаницы, пожалуйста, придерживайтесь «медиа сканера» как для текущей версии, так и для примечания к награде.

Обновление 4

# Любезно предоставлено 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

Обновление 5

По предложению Манубхаргава я попробовал 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, поскольку это та же проблема с приложениями автоматизации, которые я пробовал.


Примечание. Пожалуйста, публикуйте ответ только тогда, когда вы проверили его самостоятельно. Спасибо!

Я нашел это, это выходит за рамки моих знаний (ответы указывают на какой-то инструмент MediaScannerConnection в инструментах разработчика), но это может помочь... stackoverflow.com/questions/15147536/…
Примечание для читателей: пожалуйста, не предлагайте мне компилировать adb. Этого я не собираюсь делать, даже если вы предоставите подробности.
Исправление Sarkie MTP (APK, устанавливаемый на устройство) помогает медиасерверу сканировать файлы, скопированные с помощью MTP. Он рекурсивно сканирует каталог внешнего хранилища, а затем добавляет в Media Scanner после создания файла. Это может помочь и с ADB, стоит попробовать.

Ответы (2)

Хорошо, кажется, ответ тривиален. Моим пальцам не придется терять удобство набора текста 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?
adb shell я транслирую android.intent.action.MEDIA_MOUNTED ........Из stackoverflow.com/a/19435985/6116090
Я думаю, вы неправильно поняли мой вопрос. У меня практически нет проблем с запуском медиасервера вручную. Мой вопрос касается автоматических действий без какого-либо вмешательства с моей стороны. Это означает, что как только я это сделаю, adb push FILE /sdcard/DIR/медиасервер должен включиться и просканировать файл.
Вы пытались создать пакетный файл для автоматизации сценария. Windows - это commandlist.bat, а Linux - commandlist.sh
Да. В настоящее время я использую простой скрипт, и я не хочу зависеть от него. Я даже обратился к этому в своем вопросе. Пожалуйста, проверьте содержание ниже Обновление в моем вопросе.