2012-09-23 457 views
16

在某個點擊事件中,我要求用戶添加圖像。所以我提供了兩種選擇:如何從位圖獲取Uri對象

  1. 從圖庫中添加。
  2. 從相機中點擊新圖像。

我的目標是保留與這些圖像相關的「uri」列表。

如果用戶選擇畫廊,那麼我得到的圖像uri(這很簡單)。 但是,如果他選擇了照相機,然後拍照後,我得到該圖片的位圖對象。

現在我該如何將該位圖對象轉換爲uri,換句話說,我該如何獲取該位圖對象的相對Uri對象?

謝謝。

+0

這可能有助於http:// stackoverflow。com/questions/7636697/get-path-and-filename-from-camera-intent-result –

+0

一些代碼非常硬編碼。 我不想硬編碼圖像的文件名。 並不見得圖像保存在DCIM文件夾.. –

回答

0

我試着從post I mentioned in my comment..下面的代碼片段,它對我來說工作正常。

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

輸出的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 

而且我沒有看到在上面的代碼片斷任何harcoded名。 希望這有助於。

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

我有同樣的問題,在我的項目,所以我按照簡單的方法(click here)從位圖得到URI。

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'現在是'你需要記住添加此權限MediaStore.Images.Media.insertImage'第二件事:'<使用許可權的android :name =「android.permission.WRITE_EXTERNAL_STORAGE」/>' –

+8

它在android 6.0中返回null路徑 –

+0

兩個棉花糖設備,摩托羅拉'返回路徑',但三星'返回null'。任何幫助? – sud007

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

上述創建使用位圖的縮略圖行,可能會消耗你的Android設備的一些額外的空間。

此方法可以幫助您從位圖中獲取Uri而不消耗一些額外的內存。

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

calculateInSampleSize是什麼?請爲它添加方法 –

+0

@Anand:這個http://stackoverflow.com/questions/2641726/decoding-bitmaps-in-android-with-the-right-size可以幫助你,如果你找到適當的解決方案,那麼請告知。 – Hanan

+0

您可以忽略inSampleSize。將樣本大小設置爲2會將圖像質量降低2,就好像僅採用圖像的每個第二像素一樣。把1或不設置這個選項是可以的。 – lxknvlk

0

這就是爲我工作的。例如以位圖的形式從視頻獲取縮略圖。然後我們可以將位圖對象轉換爲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

如果從相機獲得的圖像也沒有辦法從位圖得到開放的,所以你應該先救你的位圖。

啓動相機意圖

startActivityForResult(Intent(MediaStore.ACTION_IMAGE_CAPTURE), 8) 

然後,覆蓋

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

還創建方法來存儲位圖,然後返回烏里

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:不要忘了添加權限和處理運行時權限(API> = 23)