0

我有带有文件浏览器的视频播放器应用程序,其中列出了 SD 卡上的所有视频

受我想在 sd 卡中获取音频文件启发的代码

使用 ContentResolver,按预期工作,但如果卡上的文件发生更改,它不会更新。我不是说自动,而是在视图/应用程序重新启动后。甚至重新安装应用程序都没有帮助,仍然显示相同的文件。删除的视频文件在 PC 上不可见,也无法播放(此视频无法播放(翻译))。

我转储了数据,问题不在视图缓存或其他地方。我没有实现自己的任何缓存,也没有找到任何关于此事的信息。谢谢

代码:

    // acquisition  
    String[] projection = {
        MediaStore.Video.Media._ID,
        MediaStore.Video.Media.DISPLAY_NAME,
        MediaStore.Video.Media.DURATION,
        MediaStore.Video.Media.DATA
    };

    ContentResolver resolver = getActivity().getContentResolver();
    Cursor videoCursor = resolver.query(
        MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
        projection,
        null,
        null,
        null
    );

    // extraction
    while(cursor.moveToNext()) {
        cursorIndex = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
        filepath = cursor.getString(cursorIndex);

        cursorIndex = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME);
        filename = cursor.getString(cursorIndex);

        cursorIndex = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION);
        duration = cursor.getString(cursorIndex);

        result[ index++ ] = new VideoFileMetadata(filename, duration, filepath);
    }

编辑 1 [14-03-2013]:

我尝试添加number + " = " + number到 ORDER 或 WHERE 子句以充当潜在的查询缓存破坏者,但它没有效果(尽管它有可能被优化器作为无用的子句删除)。这次我使用不同的证书从另一台机器重新安装了应用程序,但查询结果保持不变,列出当前不存在的文件。

4

1 回答 1

4

你应该先打电话cursor.moveToFirst()

所以,你的光标迭代循环应该看起来像

if (cursor.moveToFirst()) {
    do {
        // cursorIndex = cursor.getColumnIndexOrThrow, etc...
    } while (cursor.moveToNext());
}
于 2013-04-10T08:21:24.690 回答