2012-04-10 33 views
2

一個開放的內容,我燒的意圖相機如下拍照:檢索從相機意向

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
Uri myPhoto = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), 
    "the_photo.jpg")); 

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, myPhoto); 
startActivityForResult(cameraIntent, INTENT_GET_PICTURE_FROM_CAMERA); 

現在我想要得到的縮略圖照片顯示。如果我存儲「myPhoto」Uri,我可以在文件系統上看到完全的文件。但是,要使用Media Store API,我需要內容Uri表單上的Uri。無論如何,從相機回饋的意圖檢索這個,如果沒有,我怎麼能將我的文件系統Uri轉換爲Android內容Uri。

請注意,我知道我可以將位圖解碼,然後進行下采樣。這不是我想要的。我可以查詢所有的縮略圖,我發現它存在,所以我想從系統中獲取它。

謝謝

回答

2

我通過對項目執行介質掃描來解決它。從那裏我能得到的內容URI(在下面的代碼處理程序的額外的併發症是因爲我需要我的結果在UI線程來處理,因爲它操縱的觀點):

private Uri mCameraFilePath; 
private Context mContext; 
... 

private void handlePictureFromCamera(Intent data) { 

    MyMediaScannerClient client = new MyMediaScannerClient(
      mCameraFilePath.getPath(), new Handler(), new OnMediaScanned() { 

     @Override 
     public void mediaScanned(Uri contentUri) { 
      //Here I have the content uri as its now in the media store 
     } 
    }); 
    MediaScannerConnection connection = new MediaScannerConnection(mContext, client); 
    client.mConnection = connection; 
    connection.connect(); 
} 

private interface OnMediaScanned { 
    public void mediaScanned(Uri contentUri); 
} 

/** 
* This is used to scan a given file (image in this case) to ensure it is added 
* to the media store thus making its content uri available. It returns the 
* content form Uri by means of a callback on the supplied handler's thread. 
*/ 
private class MyMediaScannerClient implements MediaScannerConnectionClient { 

    private final String mPath; 
    private MediaScannerConnection mConnection; 
    private final OnMediaScanned mFileScannedCallback; 
    private final Handler mHandler; 

    public MyMediaScannerClient(String path, Handler handler, OnMediaScanned fileScannedCallback) { 
     mPath = path; 
     mFileScannedCallback = fileScannedCallback; 
     mHandler = handler; 
    } 

    @Override 
    public void onMediaScannerConnected() { 
     mConnection.scanFile(mPath, null); 
    } 

    @Override 
    public void onScanCompleted(String path, final Uri uri) { 

     mConnection.disconnect(); 
     mHandler.post(new Runnable() { 

      @Override 
      public void run() { 
       mFileScannedCallback.mediaScanned(uri); 
      } 
     }); 
    } 
} 
+0

我需要做類似的事情,我找不到解決方案,你能告訴我你在哪裏叫「handlePictureFromCamera(intent)」?我保留了獲取內容uri的方式,但我真的需要回調 – Jordi 2012-11-13 08:03:40

+0

我在相機完成時直接從onActivityResult調用它。 – steprobe 2012-11-15 11:05:27

0

AS我評論,我需要類似的東西(以獲得「content:// media/external/images/xxx」uri格式),並且您的解決方案工作得很好。謝謝! 但我找到了一個更短的方式來做到這一點(也許它不適用於你,但對其他人)。

使用相同的意圖製劑作爲你的(第一柱),但與 「CAMERA_REQUEST」

內部onActivityResult

getContentResolver().notifyChange(mCapturedImageURI, null); 
    ContentResolver cr = getContentResolver(); 
    Uri uriContent = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), photo.getAbsolutePath(), null, null)); 

和獲取 'uriContent' 在「內容://媒體/外部/ images/xxx'格式。