手动触发MediaScanner扫描内部存储文件(Nougat/Oreo)

2次阅读
没有评论

问题描述

在使用Termux管理文件时,经常使用mv命令移动或重命名文件。然而,在使用命令行对内部存储(如/storage/emulated/0)进行更改后,这些更改不会立即反映在依赖MediaScanner的应用程序中,如相册等。需要手动触发MediaScanner重新扫描这些更改。

解决方案

请注意,以下操作需要root权限,请确保设备已获得root权限。

方案1:发送显式广播

在Android 8.0(Oreo)及以上版本中,隐式广播不再被允许,因此需要发送显式广播。可以使用-p参数指定组件名称或使用-n参数指定完整包名来发送广播。

步骤

  1. 使用正确的路径
  2. 确保使用正确的路径,例如/storage/emulated/0

  3. 发送广播

  4. 使用以下命令发送广播:
    sh
    am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///storage/emulated/0 -p com.android.providers.media

  5. 验证

  6. 执行上述命令后,检查MediaScanner是否成功重新扫描了指定目录。

注意事项

  • 该命令需要root权限才能执行。
  • 如果设备运行的是Android 10,可能会遇到权限拒绝错误,此时需要以root用户身份执行命令。

方案2:逐个文件扫描

如果需要对单个文件进行扫描,可以使用android.intent.action.MEDIA_SCANNER_SCAN_FILE广播。但是,该广播要求提供文件的完整路径。

步骤

  1. 获取文件路径
  2. 获取需要扫描的文件的完整路径。

  3. 发送广播

  4. 使用以下命令发送广播:
    sh
    am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///path/to/file

注意事项

  • 该广播同样需要root权限才能执行。
  • 如果文件名包含特殊字符(如[]),可能会导致异常行为。

方案3:使用ADB调试

如果需要从ADB调试器中执行上述命令,可以使用root用户身份执行:

  1. 切换到root用户
  2. 使用以下命令切换到root用户:
    sh
    su

  3. 执行广播命令

  4. 执行上述任一方案中的广播命令。

示例

假设需要扫描/storage/emulated/0/myfolder目录下的所有文件,可以使用以下命令:

su
am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///storage/emulated/0/myfolder -p com.android.providers.media

总结

通过发送显式广播或逐个文件扫描,可以手动触发MediaScanner重新扫描内部存储文件。确保在执行这些操作时具有足够的权限,并根据实际情况调整路径和命令。

正文完