我的应用程序正在从一个特殊目录访问文件。我希望当用户将设备连接到计算机并修改文件(添加,删除,重命名等)时通知应用程序。 不需要按文件通知,应用程序只需要知道它应该重新扫描目录 理想的解决方案也适用于SD卡。
FileObserver
在这种情况下不起作用(文档间接说明了这一点)。
我尝试使用BroadcastReceiver
来监视ACTION_MEDIA_MOUNTED
意图,没有运气。
由于我对音频文件感兴趣,我也尝试了ACTION_MEDIA_SCANNER_STARTED
,但事实证明这是不可靠的:它适用于SGS3,但不适用于搭载Android 5.1的Nexus 7。我认为不保证媒体扫描仪可以在所有设备上运行。
我可以尝试使用不同方法的组合(观察上面想到的所有意图,也许是其他人的谎言ACTION_POWER_DISCONNECTED
),但如果可能的话,我想使用更可靠的方法
答案 0 :(得分:0)
我无法找到一个好的解决方案,但我认为我找到了一个令人满意的解决方案。
我已从观看Intent.ACTION_MEDIA_SCANNER_STARTED
转为使用ContentObserver
。多次调用ContentObserver.onChange
方法,因此我使用计时器将每次调用时的实际文件扫描延迟到onChange
。
public class MediaStoreUpdateObserver extends ContentObserver {
private static final int RESCAN_DELAY_MS = 15000;
private final Handler mainThreadHandler;
public MediaStoreUpdateObserver(Handler mainThreadHandler) {
super(mainThreadHandler);
this.mainThreadHandler = mainThreadHandler;
}
@Override
public void onChange(boolean selfChange) {
mainThreadHandler.removeCallbacks(delayedRescanTask);
mainThreadHandler.postDelayed(delayedRescanTask, RESCAN_DELAY_MS);
}
private final Runnable delayedRescanTask = new Runnable() {
@Override
public void run() {
// Start file rescan.
}
};
}
同样,这是一个黑客,但它确实起作用。