问题描述
在使用Termux管理文件时,经常使用mv
命令移动或重命名文件。然而,在使用命令行对内部存储(如/storage/emulated/0
)进行更改后,这些更改不会立即反映在依赖MediaScanner的应用程序中,如相册等。需要手动触发MediaScanner重新扫描这些更改。
解决方案
请注意,以下操作需要root权限,请确保设备已获得root权限。
方案1:发送显式广播
在Android 8.0(Oreo)及以上版本中,隐式广播不再被允许,因此需要发送显式广播。可以使用-p
参数指定组件名称或使用-n
参数指定完整包名来发送广播。
步骤
- 使用正确的路径
-
确保使用正确的路径,例如
/storage/emulated/0
。 -
发送广播
-
使用以下命令发送广播:
sh
am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///storage/emulated/0 -p com.android.providers.media -
验证
- 执行上述命令后,检查MediaScanner是否成功重新扫描了指定目录。
注意事项
- 该命令需要root权限才能执行。
- 如果设备运行的是Android 10,可能会遇到权限拒绝错误,此时需要以root用户身份执行命令。
方案2:逐个文件扫描
如果需要对单个文件进行扫描,可以使用android.intent.action.MEDIA_SCANNER_SCAN_FILE
广播。但是,该广播要求提供文件的完整路径。
步骤
- 获取文件路径
-
获取需要扫描的文件的完整路径。
-
发送广播
- 使用以下命令发送广播:
sh
am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///path/to/file
注意事项
- 该广播同样需要root权限才能执行。
- 如果文件名包含特殊字符(如
[]
),可能会导致异常行为。
方案3:使用ADB调试
如果需要从ADB调试器中执行上述命令,可以使用root用户身份执行:
- 切换到root用户
-
使用以下命令切换到root用户:
sh
su -
执行广播命令
- 执行上述任一方案中的广播命令。
示例
假设需要扫描/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重新扫描内部存储文件。确保在执行这些操作时具有足够的权限,并根据实际情况调整路径和命令。