【问题标题】:Saved (bitmaps) images take a while to appear in gallery保存的(位图)图像需要一段时间才能出现在图库中
【发布时间】:2018-10-19 23:03:44
【问题描述】:

我有一个应用程序可以对位图进行一些编辑,然后将它们保存到媒体商店。它成功保存到文件浏览器,但需要一段时间才能出现在图库中(最多几个小时)或直到我重新启动设备。

注意:图像会立即保存到文件浏览器中,就可以了

这是我的图像保护程序类:

public class ImageSaver {


public static final String insertImage(ContentResolver cr,
                                       Bitmap source,
                                       String title,
                                       String description) {

    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.TITLE, title);
    values.put(MediaStore.Images.Media.DISPLAY_NAME, title);
    values.put(MediaStore.Images.Media.DESCRIPTION, description);
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
    // Add the date meta data to ensure the image is added at the front of the gallery
    values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
    values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());

    Uri url = null;
    String stringUrl = null;    /* value to be returned */

    try {
        url = cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

        if (source != null) {
            OutputStream imageOut = cr.openOutputStream(url);
            try {
                source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut);
            } finally {
                imageOut.close();
            }

            long id = ContentUris.parseId(url);
            // Wait until MINI_KIND thumbnail is generated.
            Bitmap miniThumb = MediaStore.Images.Thumbnails.getThumbnail(cr, id, MediaStore.Images.Thumbnails.MINI_KIND, null);
            // This is for backward compatibility.
            storeThumbnail(cr, miniThumb, id, 50F, 50F, MediaStore.Images.Thumbnails.MICRO_KIND);
        } else {
            cr.delete(url, null, null);
            url = null;
        }
    } catch (Exception e) {
        if (url != null) {
            cr.delete(url, null, null);
            url = null;
        }
    }

    if (url != null) {
        stringUrl = url.toString();
    }

    return stringUrl;
}

/**
 * A copy of the Android internals StoreThumbnail method, it used with the insertImage to
 * populate the android.provider.MediaStore.Images.Media#insertImage with all the correct
 * meta data. The StoreThumbnail method is private so it must be duplicated here.
 * @see android.provider.MediaStore.Images.Media (StoreThumbnail private method)
 */
private static final Bitmap storeThumbnail(
        ContentResolver cr,
        Bitmap source,
        long id,
        float width,
        float height,
        int kind) {

    // create the matrix to scale it
    Matrix matrix = new Matrix();

    float scaleX = width / source.getWidth();
    float scaleY = height / source.getHeight();

    matrix.setScale(scaleX, scaleY);

    Bitmap thumb = Bitmap.createBitmap(source, 0, 0,
            source.getWidth(),
            source.getHeight(), matrix,
            true
    );

    ContentValues values = new ContentValues(4);
    values.put(MediaStore.Images.Thumbnails.KIND,kind);
    values.put(MediaStore.Images.Thumbnails.IMAGE_ID,(int)id);
    values.put(MediaStore.Images.Thumbnails.HEIGHT,thumb.getHeight());
    values.put(MediaStore.Images.Thumbnails.WIDTH,thumb.getWidth());

    Uri url = cr.insert(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, values);

    try {
        OutputStream thumbOut = cr.openOutputStream(url);
        thumb.compress(Bitmap.CompressFormat.JPEG, 100, thumbOut);
        thumbOut.close();
        return thumb;
    } catch (FileNotFoundException ex) {
        return null;
    } catch (IOException ex) {
        return null;
    }
 }
}

【问题讨论】:

    标签: java android bitmap imageview gallery


    【解决方案1】:

    尝试使用以下代码:

    MediaScannerConnection.scanFile(
        context,
        new String[] { "path/to/file.jpg" }, 
        null,   // optional mine type
        null    // optional callback
    );
    

    在您将图像保存到存储中时,仍然需要告诉图库应用程序扫描您的文件。

    【讨论】:

      【解决方案2】:

      你没有告诉系统文件存在。你需要这样做,它不会神奇地检测到它。查看MediaScannerConnection 了解如何操作。

      【讨论】:

        【解决方案3】:

        您有几个选择。 您可以告诉 Android 重新扫描自己,“不推荐”,因为这既费时又慢。或者,您可以只使用一条新记录更新 Android。

        所以当我创建或删除图像时,我通常会做什么。我创建了一个 AsyncTask 来更新 android 设备上的媒体,并通过 post 执行成功。

        只需将此代码放入您的 onExecute 中即可。

         MediaScannerConnection.scanFile(mContext, new String[]{ mPassedInURLToAddedOrRemovedImageString }, null, null);
        

        Android 将完成剩下的工作。但我确实建议放置一个异步任务。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-07
          • 2018-10-28
          • 2012-10-26
          • 1970-01-01
          • 2013-11-18
          相关资源
          最近更新 更多