(最大 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 が呼び出されません。