Android应用程序如何发现文件已从PC修改?

时间:2015-04-11 17:31:48

标签: android

我的应用程序正在从一个特殊目录访问文件。我希望当用户将设备连接到计算机并修改文件(添加,删除,重命名等)时通知应用程序。 不需要按文件通知,应用程序只需要知道它应该重新扫描目录 理想的解决方案也适用于SD卡。

FileObserver在这种情况下不起作用(文档间接说明了这一点)。

我尝试使用BroadcastReceiver来监视ACTION_MEDIA_MOUNTED意图,没有运气。 由于我对音频文件感兴趣,我也尝试了ACTION_MEDIA_SCANNER_STARTED,但事实证明这是不可靠的:它适用于SGS3,但不适用于搭载Android 5.1的Nexus 7。我认为不保证媒体扫描仪可以在所有设备上运行。

我可以尝试使用不同方法的组合(观察上面想到的所有意图,也许是其他人的谎言ACTION_POWER_DISCONNECTED),但如果可能的话,我想使用更可靠的方法

1 个答案:

答案 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.
        }
    };
}

同样,这是一个黑客,但它确实起作用。