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


Cómo obtener Bitmap de un Uri?

Cómo obtener un objeto Bitmap desde un Uri (si consigo almacenarlo en /data/data/MYFOLDER/myimage.png o file///data/data/MYFOLDER/myimage.png ) para usarlo en mi aplicación?

¿Alguien tiene una idea sobre cómo lograr esto?

  • Programación de Android - Hacer un URI para obtener la ubicación de audio
  • Widget de aplicación setImageViewUri no actualiza la imagen
  • Cómo escuchar un URI personalizado
  • Obtener el número de teléfono de la URI de búsqueda
  • Image uri no muestra imágenes en ImageView en algún dispositivo Android
  • ¿Cómo puedo eliminar archivos mediante programación en Android?
  • Uso de una URL web para SUGGEST_COLUMN_ICON_1 para sugerencias de búsqueda
  • Cómo utilizar ExifInterface con una secuencia o un URI
  • 7 Solutions collect form web for “Cómo obtener Bitmap de un Uri?”

    . . IMPORTANTE: Ver respuesta de @Mark Ingram a continuación y @pjv para una mejor solución. . .

    Usted podría intentar esto:

     public Bitmap loadBitmap(String url) { Bitmap bm = null; InputStream is = null; BufferedInputStream bis = null; try { URLConnection conn = new URL(url).openConnection(); conn.connect(); is = conn.getInputStream(); bis = new BufferedInputStream(is, 8192); bm = BitmapFactory.decodeStream(bis); } catch (Exception e) { e.printStackTrace(); } finally { if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } return bm; } 

    Pero recuerde, este método sólo debe ser llamado desde dentro de un hilo (no GUI-thread). I un AsyncTask.

    Aquí está la manera correcta de hacerlo:

     protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { Uri imageUri = data.getData(); Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri); } } 

    Si necesita cargar imágenes muy grandes, el código siguiente lo cargará en mosaicos (evitando asignaciones de memoria grandes):

     BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(myStream, false); Bitmap region = decoder.decodeRegion(new Rect(10, 10, 50, 50), null); 

    Vea la respuesta aquí

    Aquí está la manera correcta de hacerlo, manteniendo las pestañas sobre el uso de la memoria también:

     protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { Uri imageUri = data.getData(); Bitmap bitmap = getThumbnail(imageUri); } } public static Bitmap getThumbnail(Uri uri) throws FileNotFoundException, IOException{ InputStream input = this.getContentResolver().openInputStream(uri); BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options(); onlyBoundsOptions.inJustDecodeBounds = true; onlyBoundsOptions.inDither=true;//optional onlyBoundsOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//optional BitmapFactory.decodeStream(input, null, onlyBoundsOptions); input.close(); if ((onlyBoundsOptions.outWidth == -1) || (onlyBoundsOptions.outHeight == -1)) { return null; } int originalSize = (onlyBoundsOptions.outHeight > onlyBoundsOptions.outWidth) ? onlyBoundsOptions.outHeight : onlyBoundsOptions.outWidth; double ratio = (originalSize > THUMBNAIL_SIZE) ? (originalSize / THUMBNAIL_SIZE) : 1.0; BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmapOptions.inSampleSize = getPowerOfTwoForSampleRatio(ratio); bitmapOptions.inDither = true; //optional bitmapOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;// input = this.getContentResolver().openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions); input.close(); return bitmap; } private static int getPowerOfTwoForSampleRatio(double ratio){ int k = Integer.highestOneBit((int)Math.floor(ratio)); if(k==0) return 1; else return k; } 

    La llamada getBitmap () desde el post de Mark Ingram también llama a decodeStream (), por lo que no pierde ninguna funcionalidad.

    Referencias:

    • Android: Obtener miniatura de la imagen en la tarjeta SD, dado Uri de la imagen original

    • Manejo de mapas de bits grandes

     try { Bitmap bitmap = MediaStore.Images.Media.getBitmap(c.getContentResolver() , Uri.parse(paths)); } catch (Exception e) { //handle exception } 

    Y sí camino debe ser en un formato de este tipo

    file:///mnt/sdcard/filename.jpg

      private void uriToBitmap(Uri selectedFileUri) { try { ParcelFileDescriptor parcelFileDescriptor = getContentResolver().openFileDescriptor(selectedFileUri, "r"); FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor); parcelFileDescriptor.close(); } catch (IOException e) { e.printStackTrace(); } } 

    Usted puede hacer esta estructura:

     protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { super.onActivityResult(requestCode, resultCode, imageReturnedIntent); switch(requestCode) { case 0: if(resultCode == RESULT_OK){ Uri selectedImage = imageReturnedIntent.getData(); Bundle extras = imageReturnedIntent.getExtras(); bitmap = extras.getParcelable("data"); } break; } 

    Por esto usted puede convertir fácilmente un uri al mapa de bits. Esperanza ayuda u.

    Utilice el método startActivityForResult como a continuación

      startActivityForResult(new Intent(Intent.ACTION_PICK).setType("image/*"), PICK_IMAGE); 

    Y puede obtener resultados como este:

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) { return; } switch (requestCode) { case PICK_IMAGE: Uri imageUri = data.getData(); try { Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri); } catch (IOException e) { e.printStackTrace(); } break; } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.