zhihu / Matisse

:fireworks: A well-designed local image and video selector for Android
Apache License 2.0
12.52k stars 2.07k forks source link

添加Bitmap至相册后,在Matisse中找不到该图片。 #770

Open reichin opened 4 years ago

reichin commented 4 years ago

添加Bitmap至相册

public static String addBitmapToAlbum(ContentResolver resolver,
                                          Bitmap bitmap,
                                          String displayName,
                                          String mimeType,
                                          Bitmap.CompressFormat compressFormat) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, displayName);
        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
        String pathname = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES).getPath() + File.separator + displayName;

        contentValues.put(MediaStore.MediaColumns.DATA, pathname);
        contentValues.put(MediaStore.Images.ImageColumns.DATE_TAKEN, System.currentTimeMillis());

        Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
        if (uri != null) {
            OutputStream outputStream = null;
            try {
                outputStream = resolver.openOutputStream(uri);
                bitmap.compress(compressFormat, 100, outputStream);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                if (null != outputStream) {
                    try {
                        outputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return pathname;
    }

此时,进入相册能找到该图片,但是通过Matisse,却找不到。 查看源码发现,Matisse中验证了_size>0。因此,需要加入下面代码:

contentValues.put(MediaStore.MediaColumns.SIZE, bitmap.getByteCount());

但是,bitmap.getByteCount()获取的并不是文件的真实大小,请问有什么好的解决方法吗?

MoonLoong commented 3 years ago
/**
  * 得到bitmap的大小
  */
 public static int getBitmapSize(Bitmap bitmap) {
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {   
         return bitmap.getAllocationByteCount();
     }
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1){
         return bitmap.getByteCount();
     }
     // 在低版本中用一行的字节x高度
     return bitmap.getRowBytes() * bitmap.getHeight();              
 }