• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.example.rscamera;
18 
19 import java.io.FileNotFoundException;
20 import java.io.IOException;
21 import java.io.OutputStream;
22 
23 import android.content.ContentResolver;
24 import android.content.ContentUris;
25 import android.content.ContentValues;
26 import android.graphics.Bitmap;
27 import android.graphics.Matrix;
28 import android.net.Uri;
29 import android.provider.MediaStore;
30 import android.provider.MediaStore.Images;
31 
32 /**
33  * Utility class to save images into android image database
34  */
35 public class MediaStoreSaver {
36     public static interface StreamWriter {
write(OutputStream imageOut)37         void write(OutputStream imageOut) throws IOException;
38     }
39 
insertImage(ContentResolver contentResolver, Bitmap image, String title, String description)40     public static final String insertImage(ContentResolver contentResolver,
41                                            Bitmap image,
42                                            String title,
43                                            String description) {
44         final Bitmap source = image;
45         StreamWriter streamWriter = new StreamWriter() {
46             public void write(OutputStream imageOut) {
47                 source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut);
48             }
49         };
50         return insertImage(contentResolver, streamWriter, title, description);
51     }
52 
53 
insertImage(ContentResolver cr, StreamWriter source, String title, String description)54     public static final String insertImage(ContentResolver cr,
55                                            StreamWriter source,
56                                            String title,
57                                            String description) {
58 
59         ContentValues values = new ContentValues();
60         values.put(Images.Media.TITLE, title);
61         values.put(Images.Media.DISPLAY_NAME, title);
62         values.put(Images.Media.DESCRIPTION, description);
63         values.put(Images.Media.MIME_TYPE, "image/jpeg");
64         // Add the date meta data to ensure the image is added at the front of the gallery
65         values.put(Images.Media.DATE_ADDED, System.currentTimeMillis());
66         values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis());
67 
68         Uri url = null;
69         String stringUrl = null;    /* value to be returned */
70 
71         try {
72             url = cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
73 
74             if (source != null) {
75                 OutputStream imageOut = cr.openOutputStream(url);
76                 try {
77                     source.write(imageOut);
78                 } finally {
79                     imageOut.close();
80                 }
81 
82                 long id = ContentUris.parseId(url);
83                 // Wait until MINI_KIND thumbnail is generated.
84                 Bitmap miniThumb = Images.Thumbnails.getThumbnail(cr, id, Images.Thumbnails.MINI_KIND, null);
85                 // This is for backward compatibility.
86                 storeThumbnail(cr, miniThumb, id, 50F, 50F, Images.Thumbnails.MICRO_KIND);
87             } else {
88                 cr.delete(url, null, null);
89                 url = null;
90             }
91         } catch (Exception e) {
92             if (url != null) {
93                 cr.delete(url, null, null);
94                 url = null;
95             }
96         }
97 
98         if (url != null) {
99             stringUrl = url.toString();
100         }
101 
102         return stringUrl;
103     }
104 
105     /**
106      * A copy of the Android internals StoreThumbnail method, it used with the insertImage to
107      * populate the android.provider.MediaStore.Images.Media#insertImage with all the correct
108      * meta data. The StoreThumbnail method is private so it must be duplicated here.
109      *
110      * @see android.provider.MediaStore.Images.Media (StoreThumbnail private method)
111      */
storeThumbnail( ContentResolver cr, Bitmap source, long id, float width, float height, int kind)112     private static final Bitmap storeThumbnail(
113             ContentResolver cr,
114             Bitmap source,
115             long id,
116             float width,
117             float height,
118             int kind) {
119 
120         // create the matrix to scale it
121         Matrix matrix = new Matrix();
122 
123         float scaleX = width / source.getWidth();
124         float scaleY = height / source.getHeight();
125 
126         matrix.setScale(scaleX, scaleY);
127 
128         Bitmap thumb = Bitmap.createBitmap(source, 0, 0,
129                 source.getWidth(),
130                 source.getHeight(), matrix,
131                 true
132         );
133 
134         ContentValues values = new ContentValues(4);
135         values.put(Images.Thumbnails.KIND, kind);
136         values.put(Images.Thumbnails.IMAGE_ID, (int) id);
137         values.put(Images.Thumbnails.HEIGHT, thumb.getHeight());
138         values.put(Images.Thumbnails.WIDTH, thumb.getWidth());
139 
140         Uri url = cr.insert(Images.Thumbnails.EXTERNAL_CONTENT_URI, values);
141 
142         try {
143             OutputStream thumbOut = cr.openOutputStream(url);
144             thumb.compress(Bitmap.CompressFormat.JPEG, 100, thumbOut);
145             thumbOut.close();
146             return thumb;
147         } catch (FileNotFoundException ex) {
148             return null;
149         } catch (IOException ex) {
150             return null;
151         }
152     }
153 
154 
155 }
156