28

On a certain tap event, I ask the user to add an image. So I provide two options:

  1. To add from gallery.
  2. To click a new image from camera.

My aim is to keep a list of URIs related to those images.

If the user chooses gallery, then I get the image URI (which is quite simple). But if they choose camera, then after taking a picture, I get the Bitmap object of that picture.

Now how do I convert that Bitmap object to URI, or in other words, how can I get the relative Uri object of that bitmap object?

Thanks.

2
  • This might help stackoverflow.com/questions/7636697/… Commented Sep 23, 2012 at 20:00
  • some of the code is pretty much hardcoded. I don't want to hard code the file name of the image. And not necessarily the image is saved in the DCIM folder.. Commented Sep 24, 2012 at 6:32

6 Answers 6

58

I have same problem in my project, so i follow the simple method (click here) to get Uri from bitmap.

public Uri getImageUri(Context inContext, Bitmap inImage) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); return Uri.parse(path); } 
Sign up to request clarification or add additional context in comments.

7 Comments

Images.Media.insertImage is now MediaStore.Images.Media.insertImage Second thing you need to remember to add this permission: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
It return null path in android 6.0
Two marshmallow devices, Motorola returns path but Samsung returns null. Any help?
how to I delete this inserted bitmap file from storage ?
@AnandSavjani did you fix it?
|
7
Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 

the line mentioned above create a thumbnail using bitmap, that may consume some extra space in your android device.

This method may help you to get the Uri from bitmap without consuming some extra memory.

public Uri bitmapToUriConverter(Bitmap mBitmap) { Uri uri = null; try { final BitmapFactory.Options options = new BitmapFactory.Options(); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, 100, 100); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; Bitmap newBitmap = Bitmap.createScaledBitmap(mBitmap, 200, 200, true); File file = new File(getActivity().getFilesDir(), "Image" + new Random().nextInt() + ".jpeg"); FileOutputStream out = getActivity().openFileOutput(file.getName(), Context.MODE_WORLD_READABLE); newBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); //get absolute path String realPath = file.getAbsolutePath(); File f = new File(realPath); uri = Uri.fromFile(f); } catch (Exception e) { Log.e("Your Error Message", e.getMessage()); } return uri; } public static int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight) { // Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) { inSampleSize *= 2; } } return inSampleSize; } 

for more details goto Loading Large Bitmaps Efficiently

8 Comments

what is calculateInSampleSize ?? Please add method for it
@Anand : This stackoverflow.com/questions/2641726/… may help you, if you find proper solution then please inform.
you can ignore inSampleSize. Setting samplesize to 2 will reduce image quality by 2, as if taking only each second pixel of the image, something like that. Putting 1 or not setting this option would be ok.
i can confirm what i said about inSampleSize. Also, this method would distort image if it is not rectangular. To work with images other than rectangular, use this line Bitmap newBitmap = Bitmap.createScaledBitmap(mBitmap, mBitmap.getWidth(), mBitmap.getHeight(), true);
This always returns null for me.
|
1

This is what worked for me. For example getting thumbnail from a video in the form of a bitmap. Then we can convert the bitmap object to uri object.

String videoPath = mVideoUri.getEncodedPath(); System.out.println(videoPath); //prints to console the path of the saved video Bitmap thumb = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.MINI_KIND); Uri thumbUri = getImageUri(this, thumb); 

1 Comment

what's getImageUri?
0

I tried the following code snippet from the post I mentioned in my comment.. and it's working fine for me.

/** * Gets the last image id from the media store * * @return */ private int getLastImageId() { final String[] imageColumns = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA }; final String imageOrderBy = MediaStore.Images.Media._ID + " DESC"; Cursor imageCursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy); if (imageCursor.moveToFirst()) { int id = imageCursor.getInt(imageCursor .getColumnIndex(MediaStore.Images.Media._ID)); String fullPath = imageCursor.getString(imageCursor .getColumnIndex(MediaStore.Images.Media.DATA)); Log.d(getClass().getSimpleName(), "getLastImageId::id " + id); Log.d(getClass().getSimpleName(), "getLastImageId::path " + fullPath); imageCursor.close(); return id; } else { return 0; } } 

OutPut in logcat:

09-24 16:36:24.500: getLastImageId::id 70 09-24 16:36:24.500: getLastImageId::path /mnt/sdcard/DCIM/Camera/2012-09-24 16.36.20.jpg 

Also I don't see any harcoded names in the above code snippet. Hope this helps.

Comments

0

Note : if you are using android 6.0 or greater version path will give null value. so you have to add permission <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

public void onClicked(View view){ Bitmap bitmap=getBitmapFromView(scrollView,scrollView.getChildAt(0).getHeight(),scrollView.getChildAt(0).getWidth()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG,90,baos); String path = MediaStore.Images.Media.insertImage(getContentResolver(),bitmap,"title",null); Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("image/jpeg"); intent.putExtra(Intent.EXTRA_STREAM,Uri.parse(path)); startActivity(Intent.createChooser(intent,"Share Screenshot Using")); } 

Comments

0

Try to use the below Code. May be helpful to you:

new AsyncTask<Void, Integer, Void>() { protected void onPreExecute() { }; @Override protected Void doInBackground(Void... arg0) { imageAdapter.images.clear(); initializeVideoAndImage(); return null; } protected void onProgressUpdate(Integer... integers) { imageAdapter.notifyDataSetChanged(); } public void initializeVideoAndImage() { final String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Thumbnails._ID }; String orderBy = MediaStore.Images.Media._ID; Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, orderBy); final String[] videocolumns = { MediaStore.Video.Thumbnails._ID, MediaStore.Video.Media.DATA }; orderBy = MediaStore.Video.Media._ID; Cursor videoCursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videocolumns, null, null, orderBy); int i = 0; int image_column_index = 0; if (imageCursor != null) { image_column_index = imageCursor.getColumnIndex(MediaStore.Images.Media._ID); int count = imageCursor.getCount(); for (i = 0; i < count; i++) { imageCursor.moveToPosition(i); int id = imageCursor.getInt(image_column_index); ImageItem imageItem = new ImageItem(); imageItem.id = id; imageAdapter.images.add(imageItem); } } if (videoCursor != null) { image_column_index = videoCursor.getColumnIndex(MediaStore.Video.Media._ID); int count = videoCursor.getCount(); for (i = 0; i < count; i++) { videoCursor.moveToPosition(i); int id = videoCursor.getInt(image_column_index); ImageItem imageItem = new ImageItem(); imageItem.id = id; imageAdapter.images.add(imageItem); } } publishProgress(i); if (imageCursor != null) { image_column_index = imageCursor.getColumnIndex(MediaStore.Images.Media._ID); int count = imageCursor.getCount(); for (i = 0; i < count; i++) { imageCursor.moveToPosition(i); int id = imageCursor.getInt(image_column_index); int dataColumnIndex = imageCursor.getColumnIndex(MediaStore.Images.Media.DATA); ImageItem imageItem = imageAdapter.images.get(i); Bitmap img = MediaStore.Images.Thumbnails.getThumbnail(getApplicationContext().getContentResolver(), id, MediaStore.Images.Thumbnails.MICRO_KIND, null); int column_index = imageCursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); imageItem.imagePath = imageCursor.getString(column_index); imageItem.videoPath = ""; try { File imageFile = new File(Environment.getExternalStorageDirectory(), "image" + i); imageFile.createNewFile(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); if (bos != null && img != null) { img.compress(Bitmap.CompressFormat.PNG, 100, bos); } byte[] bitmapData = bos.toByteArray(); FileOutputStream fos = new FileOutputStream(imageFile); fos.write(bitmapData); fos.close(); imageItem.thumbNailPath = imageFile.getAbsolutePath(); try { boolean cancelled = isCancelled(); // if async task is not cancelled, update the // progress if (!cancelled) { publishProgress(i); SystemClock.sleep(100); } } catch (Exception e) { Log.e("Error", e.toString()); } // publishProgress(); } catch (IOException e) { e.printStackTrace(); } // imageAdapter.images.add(imageItem); } } imageCursor.close(); if (videoCursor != null) { image_column_index = videoCursor.getColumnIndex(MediaStore.Video.Media._ID); int count = videoCursor.getCount() + i; for (int j = 0; i < count; i++, j++) { videoCursor.moveToPosition(j); int id = videoCursor.getInt(image_column_index); int column_index = videoCursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA); ImageItem imageItem = imageAdapter.images.get(i); imageItem.imagePath = videoCursor.getString(column_index); imageItem.videoPath = imageItem.imagePath; System.out.println("External : " + imageItem.videoPath); try { File imageFile = new File(Environment.getExternalStorageDirectory(), "imageV" + i); imageFile.createNewFile(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); MediaMetadataRetriever mediaVideo = new MediaMetadataRetriever(); mediaVideo.setDataSource(imageItem.videoPath); Bitmap videoFiles = mediaVideo.getFrameAtTime(); videoFiles = ThumbnailUtils.extractThumbnail(videoFiles, 96, 96); if (bos != null && videoFiles != null) { videoFiles.compress(Bitmap.CompressFormat.JPEG, 100, bos); } byte[] bitmapData = bos.toByteArray(); FileOutputStream fos = new FileOutputStream(imageFile); fos.write(bitmapData); fos.close(); imageItem.imagePath = imageFile.getAbsolutePath(); imageItem.thumbNailPath = imageFile.getAbsolutePath(); try { boolean cancelled = isCancelled(); // if async task is not cancelled, update the // progress if (!cancelled) { publishProgress(i); SystemClock.sleep(100); } } catch (Exception e) { Log.e("Error", e.toString()); } } catch (IOException e) { e.printStackTrace(); } } } videoCursor.close(); } protected void onPostExecute(Void result) { imageAdapter.notifyDataSetChanged(); }; }.execute(); } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.