Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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.

  • Filtro de intenciones para iniciar mi actividad cuando se hace clic en el URI personalizado
  • Cómo escuchar un URI personalizado
  • Programación de Android - Hacer un URI para obtener la ubicación de audio
  • Cuál es la diferencia entre Java.Net.Uri y Android.Net.Uri
  • ¿Cómo obtener el Uri de una imagen almacenada en el SDCARD?
  • Cómo obtener HTML5 video URI en HTML5VFullScreen $ SurfaceVideoView en Android 4.0?
  • Android: Guardar el objeto android.net.Uri en la base de datos
  • Android - ¿Cómo obtener Uri de archivo RAW?
  • 5 Solutions collect form web for “Cómo obtener un objeto Uri desde Bitmap”

    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); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.