保存圖片到相冊

本文主要介紹保存圖片到相冊的幾種方式。其本質上並無把圖片保存到相冊中,其實是保存在SD卡下自定義的文件夾中,目的只是讓QQ微信在選擇照片的時候馬上顯示,注:其實QQ微信也是這樣作的java

方式1-掃描文件通知相冊更新

// 通知相冊更新
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri uri = Uri.fromFile(file);
intent.setData(uri);
context.sendBroadcast(intent);

方式1-錯誤操做

MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), "name", "description");

// 通知相冊更新
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri uri = Uri.fromFile(file);
intent.setData(uri);
context.sendBroadcast(intent);

對比 方式1 和 錯誤方式 ,咱們能夠發現其實就是多了一行insertImage的代碼,而後就不能被QQ微信馬上識別了,好傷心~~android

這裏我稍微研究了一下,然而沒有發現本質緣由,不過作了如下猜想,有興趣的能夠自行研究源碼。數據庫

由於在使用ACTION_MEDIA_SCANNER_SCAN_FILE方式通知相冊更新時,也須要執行相似insertImage方法內部的某些操做,可能和ContentProvider相關的數據庫有關,因此若是你先執行了insertImage方法,那麼它在接收到這個ACTION_MEDIA_SCANNER_SCAN_FILE廣播的時候,作了以下判斷:若是已經執行了insertImage方法,那麼return;,因此不會執行再通知相冊更新了。微信

方式2-完整操做

// 插入file數據到相冊
ContentValues values = new ContentValues(9);
values.put(MediaStore.Images.Media.TITLE, "Camera");
values.put(MediaStore.Images.Media.DISPLAY_NAME, filename);
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.ORIENTATION, 0);
values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
values.put(MediaStore.Images.Media.SIZE, file.length());
Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
// 通知相冊更新
context.sendBroadcast(new Intent("com.android.camera.NEW_PICTURE", uri));

方式2-簡單操做

// 插入file數據到相冊
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
// 通知相冊更新
context.sendBroadcast(new Intent("com.android.camera.NEW_PICTURE", uri));

總結

對於Google百度出來的Android保存圖片到相冊表示無奈,90%以上都是同樣的,這個時候若是咱們仍是依靠搜索,消耗的成本是很大的,若是你可以從源碼入手,可能就會給你提供一些思路,例如:上述所說的方式2就是從insertImage方法中得出的,源碼以下:ide

/**
 * Insert an image and create a thumbnail for it.
 *
 * @param cr The content resolver to use
 * @param source The stream to use for the image
 * @param title The name of the image
 * @param description The description of the image
 * @return The URL to the newly created image, or <code>null</code> if the image failed to be stored
 *              for any reason.
 */
public static final String insertImage(ContentResolver cr, Bitmap source,
                                       String title, String description) {
    ContentValues values = new ContentValues();
    values.put(Images.Media.TITLE, title);
    values.put(Images.Media.DESCRIPTION, description);
    values.put(Images.Media.MIME_TYPE, "image/jpeg");

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

    try {
        url = cr.insert(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 = Images.Thumbnails.getThumbnail(cr, id,
                    Images.Thumbnails.MINI_KIND, null);
            // This is for backward compatibility.
            Bitmap microThumb = StoreThumbnail(cr, miniThumb, id, 50F, 50F,
                    Images.Thumbnails.MICRO_KIND);
        } else {
            Log.e(TAG, "Failed to create thumbnail, removing original");
            cr.delete(url, null, null);
            url = null;
        }
    } catch (Exception e) {
        Log.e(TAG, "Failed to insert image", e);
        if (url != null) {
            cr.delete(url, null, null);
            url = null;
        }
    }

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

    return stringUrl;
}
相關文章
相關標籤/搜索