2012-09-23 28 views
16

En un evento de toque determinado, le pido al usuario que agregue una imagen. Entonces proporciono dos opciones:Cómo obtener un objeto URI desde Bitmap

  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" relacionados con esas imágenes.

Si el usuario elige la galería, entonces obtengo la imagen uri (que es bastante simple). Pero si elige la cámara, luego de tomar una foto, obtengo el objeto Bitmap de esa imagen.

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

Gracias.

+0

Esto podría ayudar a http: // stackoverflow.com/questions/7636697/get-path-and-filename-from-camera-intent-result –

+0

parte del código está bastante codificado. No quiero codificar el nombre de archivo de la imagen. Y no necesariamente la imagen se guarda en la carpeta DCIM .. –

Respuesta

0

Probé el siguiente fragmento de código del post I mentioned in my comment.. y está funcionando 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; 
    } 
} 

producción 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 

Además no veo ningún nombre harcoded en el fragmento de código de seguridad. Espero que esto ayude.

0
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(); 

    } 
31

Tengo mismo problema en mi proyecto, por lo que siguen el método simple (click here) para obtener Uri de 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); 
} 
+4

'Images.Media.insertImage' ahora es' MediaStore.Images.Media.insertImage' Segunda cosa que debe recordar para agregar este permiso: ' ' –

+8

Devuelve una ruta nula en android 6.0 –

+0

Dos dispositivos de malvavisco, Motorola' devuelve el camino' pero Samsung 'devuelve nulo'. ¿Alguna ayuda? – sud007

5
Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 

la línea mencionada anteriormente crear un esbozo de mapa de bits utilizando, que puede consumir un poco de espacio extra en su dispositivo Android.

Este método puede ayudarlo a obtener el Uri del mapa de bits sin consumir algo de memoria extra.

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

¿qué es calculateInSampleSize? Agregue el método para ello –

+0

@Anand: Este http://stackoverflow.com/questions/2641726/decoding-bitmaps-in-android-with-the-right-size puede ayudarlo, si encuentra la solución adecuada, informe. – Hanan

+0

puede ignorar inSampleSize. Establecer el tamaño de la muestra en 2 reducirá la calidad de la imagen en 2, como si tomara solo cada segundo píxel de la imagen, algo así. Poner 1 o no establecer esta opción estaría bien. – lxknvlk

0

Esto es lo que funcionó para mí. Por ejemplo, obtener una miniatura de un video en forma de mapa de bits. Entonces podemos convertir el objeto de mapa de bits a un 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); 
0

si se obtiene la imagen de la cámara no hay manera de conseguir Uri de un mapa de bits, por lo que debe guardar su mapa de bits en primer lugar.

intención de cámara de lanzamiento

startActivityForResult(Intent(MediaStore.ACTION_IMAGE_CAPTURE), 8) 

continuación, anular

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 

    if (resultCode == Activity.RESULT_OK && requestCode == 8) { 
     val bitmap = data?.extras?.get("data") as Bitmap 

     val uri = readWriteImage(bitmap) 
    } 
} 

también crean método para almacenar mapas de bits y luego devolver el Uri

fun readWriteImage(bitmap: Bitmap): Uri { 
    // store in DCIM/Camera directory 
    val dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) 
    val cameraDir = File(dir, "Camera/") 

    val file = if (cameraDir.exists()) { 
     File(cameraDir, "LK_${System.currentTimeMillis()}.png") 
    } else { 
     cameraDir.mkdir() 
     File(cameraDir, "LK_${System.currentTimeMillis()}.png") 
    } 

    val fos = FileOutputStream(file) 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos) 
    fos.flush() 
    fos.close() 

    Uri.fromFile(file) 
} 

PS: no olvide añadirlo permiso y manejar el permiso de tiempo de ejecución (API> = 23)

Cuestiones relacionadas