1

(最大 15 秒) の期間に基づいてビデオを取得するために、MediaStore にクエリを実行しています。

私が直面している問題は、ギャラリーを使用してビデオを録画するときです。次に、自分のアプリに移動すると、このビデオがこのカーソルに表示されません。ただし、ギャラリーに移動してビデオを開くと、次にクエリを実行したときに返されます。

これが私のクエリです:

private Cursor getVideos() {
        _.log("getVideos");
        String[] proj = { MediaStore.Video.Media._ID,
                MediaStore.Video.Media.DATA,
                MediaStore.Video.Media.DISPLAY_NAME,
                MediaStore.Video.Media.SIZE, MediaStore.Video.Media.DATE_TAKEN,
                MediaStore.Video.Media.DURATION };

        return managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, proj,
                MediaStore.Video.Media.DURATION + "<=?" + " AND "
                        + MediaStore.Video.Media.DURATION + ">=?" + " AND "
                        + MediaStore.Video.Media.SIZE + ">=?", new String[] {
                        "15000", "1000", "1000" }, null);
    }

考えられる解決策は、クエリを実行する前に強制的に更新することです。MediaScannerConnection を利用する次のコードを使用してこれを試しました。

_.log("new MediaScannerConnection");
msc = new MediaScannerConnection(mContext, new MediaScannerConnectionClient() {

    public void onScanCompleted(String path, Uri uri) {
        _.log("onScanCompleted:"+path);
        msc.disconnect();
        synchronized (lock) {
            lock.notifyAll();
        }
    }

    public void onMediaScannerConnected() {
        _.log("onMediaScannerConnected:" + MediaStore.Video.Media.EXTERNAL_CONTENT_URI.toString());
        msc.scanFile(MediaStore.Video.Media.EXTERNAL_CONTENT_URI.getPath(),
                null);
    }
});
_.log("connect");
msc.connect();
synchronized (lock) {
    try {
        _.log("waiting");
        lock.wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    _.log("done waiting");
}

ただし、これで問題は解決しませんでした。一部の電話では、onMediaScannerConnected が複数回呼び出され、onScanCompleted が呼び出されません。

4

0 に答える 0