如何在安卓中插入图片后刷新相册?

25
我使用 Android API 在图库中添加了一张图片,代码如下:

Images.Media.insertImage(ctx.getContentResolver(), "scard/test.jpg", "Hello" , "description");

实际上,我传递的图片完整路径(scard/test.jpg)已经成功插入到数据库中,但是当你打开图库时,除非你关闭/重新启动设备或挂载/卸载外部存储器,否则你无法看到它。
是否有任何方法可以在需要时刷新图库?
谢谢
Bassel Kh.

你的方法不起作用,因为你使用了相对文件路径“scard/test.jpg”,而不是绝对路径“/scard/test.jpg”。 - k3b
5个回答

36

我最近遇到了这个问题,尝试了@Samuh的解决方案,但直到我发现了Google 的示例才完美解决:

   // Tell the media scanner about the new file so that it is
    // immediately available to the user.
    MediaScannerConnection.scanFile(this,
            new String[] { file.toString() }, null,
            new MediaScannerConnection.OnScanCompletedListener() {
        public void onScanCompleted(String path, Uri uri) {
            Log.i("ExternalStorage", "Scanned " + path + ":");
            Log.i("ExternalStorage", "-> uri=" + uri);
        }
    });

我自己尝试过,运行得非常完美。

或者,类似地,您可能想查看MediaScanner类的参考文献,有人在StackOverflow上曾经问过这个问题: 将图像保存到SD卡后,在Android的图库应用程序中不会显示


26

使用媒体扫描器(sendBroadcast)的解决方案。但是,在有大量图片和数据的SD卡上,这个操作可能会产生很高的处理成本。

还有另一种解决方案,即在将媒体文件保存到相册后,您应该通知相册数据库插入了另一个文件。可以像这样完成:

private void addImageGallery( File file ) {
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); // or image/png
    getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}

这段代码并不会将您的媒体文件保存到相册,只会在相册数据库中保存有关新文件的信息。您应该先存储真实的文件。

这种解决方案速度更快,因为相册不会被完全重新扫描。但是不太可靠,因为关于文件的所有信息都是手动添加的。


3
static public boolean resetExternalStorageMedia(Context context) {
    if (Environment.isExternalStorageEmulated())
        return (false);
    Uri uri = Uri.parse("file://" + Environment.getExternalStorageDirectory());
    Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED, uri);

    context.sendBroadcast(intent);
    return (true);
}

static public void notifyMediaScannerService(Context context, String path) {
    MediaScannerConnection.scanFile(context,
            new String[] { path }, null,
            new MediaScannerConnection.OnScanCompletedListener() {
        public void onScanCompleted(String path, Uri uri) {
            Log.i("ExternalStorage", "Scanned " + path + ":");
            Log.i("ExternalStorage", "-> uri=" + uri);
        }
    });
}

2

您可以使用此方法来刷新Android相册:

public void refreshAndroidGallery(Uri fileUri) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Intent mediaScanIntent = new Intent(
                    Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            mediaScanIntent.setData(fileUri);
            mContext.sendBroadcast(mediaScanIntent);
        } else {
            mContext.sendBroadcast(new Intent(
                    Intent.ACTION_MEDIA_MOUNTED,
                    Uri.parse("file://" + Environment.getExternalStorageDirectory())));
        }
    }

1
我尝试了很多方法,最终找到了完美的解决方案! 您可以将此方法应用于任何文件类型(jpg、png、pdf等)。
public void refreshGallery(File f) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Intent mediaScanIntent = new Intent(
                Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        Uri fileUri = Uri.fromFile(f); //out is your output file
        mediaScanIntent.setData(fileUri);
        sendBroadcast(mediaScanIntent);
    } else {
        sendBroadcast(new Intent(
                Intent.ACTION_MEDIA_MOUNTED,
                Uri.parse("file://" + Environment.getExternalStorageDirectory())));
    }
}
    

那么

refreshGallery(newFileName);

newFIleName是一个文件路径,您可以获取您的文件路径作为

File newFileName = new File(filePath + "/" + fileName + ".jpg");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接