Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用MediaScannerConnection.scanFile后,MediaStore中的Android缩略图未刷新_Android_Mediastore_Android Mediascanner - Fatal编程技术网

调用MediaScannerConnection.scanFile后,MediaStore中的Android缩略图未刷新

调用MediaScannerConnection.scanFile后,MediaStore中的Android缩略图未刷新,android,mediastore,android-mediascanner,Android,Mediastore,Android Mediascanner,我正在尝试构建一个类似Gallery的应用程序,它将在外部存储上执行以下功能: 列出所有包含图像的文件夹 列出所有可供公众使用的图像,这些图像不会探测Android/data中的文件 到目前为止,我可以列出所有的图像和包含图像的文件夹。然而,我后来发现这些图片和文件夹并不是最新的:在我放了一些图片(比如我只是做了一些截图或下载了一些图片)之后,它们并没有得到刷新 即使在我调用MediaScannerConnection.scanFile之后,新图片也不会出现 除了MediaScannerConn

我正在尝试构建一个类似Gallery的应用程序,它将在外部存储上执行以下功能:

列出所有包含图像的文件夹 列出所有可供公众使用的图像,这些图像不会探测Android/data中的文件 到目前为止,我可以列出所有的图像和包含图像的文件夹。然而,我后来发现这些图片和文件夹并不是最新的:在我放了一些图片(比如我只是做了一些截图或下载了一些图片)之后,它们并没有得到刷新

即使在我调用MediaScannerConnection.scanFile之后,新图片也不会出现

除了MediaScannerConnection,我还尝试了使用指定文件夹的昂贵的Intent.ACTION\u MEDIA\u SCANNER\u SCAN\u FILE方法,但没有成功

我浏览了StackOverflow以及与讨论此问题的人的各种来源,但没有一个可以提供工作方法

我查过/试过的资料来源:

代码:

如何列出所有图像:

    private String[] projectionThumbnail = new String[]{MediaStore.Images.Thumbnails._ID, MediaStore.Images.Thumbnails.IMAGE_ID, MediaStore.Images.Thumbnails.DATA};
    private Uri uriThumbnail = MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI;

    private String[] projectionFull = new String[]{MediaStore.Images.Media._ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media.DATA};
    private Uri uriFull = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;


@Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        switch (id) {
            case LOADER_ALL_IMAGES:
                return new CursorLoader(getActivity(), uriThumbnail, projectionThumbnail, null, null, MediaStore.Images.Thumbnails._ID + " DESC");
            default:
                return null;
        }
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        switch (loader.getId()) {
            case LOADER_ALL_IMAGES:
                adapter.changeCursor(cursor);
                break;
}
    }
    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        adapter.changeCursor(null);
    }

// And here's how I init the CursorLoader
LoaderManager lm = getActivity().getLoaderManager();
lm.initLoader(LOADER_ALL_IMAGES, null, this);
问题: 我在股票5.0.2和4.4上做了测试,结果都一样

我做错什么了吗? 为什么MediaScanner不工作? 注:
有趣的是,如果我打开Instagram并从那里打开select gallery。库内容正在刷新。这意味着Instagram在画廊刷新方面做得非常好,这样我的应用程序也可以接收最新的画廊内容,他们是如何做到的?

我也遇到了同样的需求。。。你解决了吗?@FidelMontesino嗨,你解决过这个问题吗?我也遇到了同样的问题,我成功地更新了mp3 ID3标签,所有元数据都在MediaStore中更新,除了嵌入mp3帧“APIC”中的缩略图。我可以通过重新启动来让它工作,建议MediaStore在启动时进行一些内部管理,但不知道如何手动触发缩略图生成。@MarkKeen有一种方法可以解决这个问题,它可能太重,但这是最好的方法:您需要手动找到每张图片及其缩略图并将它们链接在一起。因为不知何故,当你改变画廊的数据时,比如说,删除了一幅图像,它的缩略图就会留在那里,变成一个孤儿。@dumbfingers嗨,谢谢你的评论,我也得出了类似的结论。我在playstore上尝试了几个MP3唱片集艺术抓取器,它们似乎只抓取丢失的唱片集艺术,创建自己的文件夹并更新mediastore唱片集艺术。不过,我想保持一切整洁,只使用Android/data/com.Android.providers.media/albumthumbs,其中mediastore存储album thumbs目录。我想基本上我将手动执行MediaScanner在使用新的/更新的嵌入艺术品重新扫描MP3文件时无法执行的操作。@MarkKeen是的,这可能是目前最好、可靠的方法。令人遗憾的是,即使在5-6年后,Android仍未能解决这个问题
    File dcim = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
    File pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    File downloads = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

    MediaScannerConnection.scanFile(this,
            new String[]{dcim.getAbsolutePath(), pictures.getAbsolutePath(), downloads.getAbsolutePath()}, new String[]{"image/*", "image/*", "image/*"},
            new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.i("ExternalStorage", "Scanned " + path + ":");
                    Log.i("ExternalStorage", "-> uri=" + uri);
                }
            });