Cómo obtener un objeto Uri desde Bitmap

En un determinado evento tap, le pido al usuario que agregue una imagen. Así que ofrezco dos opciones:

  1. Para agregar de la galería.
  2. Para hacer clic en una nueva imagen de la cámara.

Mi objetivo es mantener una lista de "uri" s relacionados con esas imágenes.

Si el usuario elige galería, entonces obtengo la imagen uri (que es bastante simple). Pero si él elige cámara, después de tomar una imagen, estoy consiguiendo el objeto del mapa de bits de esa imagen.

Ahora, ¿cómo puedo convertir ese objeto Bitmap a uri, o en otras palabras, ¿cómo puedo obtener el objeto relativo Uri de ese objeto de mapa de bits?

Gracias.

Tengo el mismo problema en mi proyecto, así que sigo el método simple ( chasque aquí ) para conseguir Uri del mapa de bits.

public Uri getImageUri(Context inContext, Bitmap inImage) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); return Uri.parse(path); } 
 Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 

La línea mencionada anteriormente crea una miniatura utilizando mapa de bits, que puede consumir un poco de espacio adicional en su dispositivo Android.

Este método puede ayudarle a obtener el Uri de mapa de bits sin consumir alguna memoria adicional.

 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; } 

He probado el fragmento de código siguiente de la publicación que mencioné en mi comentario .. y funciona bien para mí.

 /** * 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 en 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 

También no veo ningún nombre harcoded en el fragmento de código anterior. Espero que esto ayude.

 Try To Use this 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(); } 

Esto es lo que funcionó para mí. Por ejemplo, obtener la miniatura de un vídeo en forma de mapa de bits. A continuación, podemos convertir el objeto de mapa de bits en objeto uri.

 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); 
  • Obtener la lista de contactos y el estado de skype en android
  • Cómo tomar una foto, guardarla y obtener la foto en Android
  • ¿Es posible usar Uri.Builder y no tener la parte "//"?
  • Abrir en la intención del navegador cuando el enlace también redirecciona con deep-linking
  • Convierta java.net.URI a android.net.Uri
  • Visualización de imágenes de una carpeta específica de la tarjeta SD mediante una vista de cuadrícula
  • Cómo recuperar ImageUri de un ImageView?
  • El atributo pathPrefix de Deeplink de Android se está omitiendo
  • Obtener imagen Uri + miniatura de la foto tomada con la cámara en Android
  • ¿Cómo obtener fileName de uri?
  • Content: // mms-sms / conversations / return NullPointerException en Android ICS Samsung
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.