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:
- Para agregar de la galería.
- 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.
- Visualización dinámica de imágenes del recurso / dibujable
- Recuperación de datos del último evento agregado del calendario android
- Error en la conexión http java.lang.IllegalArgumentException: El carácter no permitido en la consulta en el índice 76
- ContentObserver en el contenido: // sms / in 1.6+?
- ¿Cómo obtener el tono de llamada actual en Android?
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.
- ¿Por qué ImageView.setImageURI () funcionaría en Android 2.2 pero no en 2.1?
- Filtro de intenciones usando path, pathPrefix o pathPattern
- Image uri no muestra imágenes en ImageView en algún dispositivo Android
- Cómo escuchar un URI personalizado
- Obtener ruta y nombre de archivo del resultado de la intención de la cámara
- Descubriendo todo acerca de la clase Uri de Android: uso y propósito
- Cómo restaurar el archivo vcf sin utilizar la aplicación externa?
- ¿Cómo obtener la ruta del archivo desde URI?
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);
- Configuración de los parámetros de diseño en android
- android youtube: compartir un video de youtube a mi aplicación?