1

我試圖從用戶那裏獲取一張照片,然後將其發送到我們的服務器。我提供了兩種選擇:從圖庫中選擇或使用手機中的默認相機拍攝新照片。Android:使用相機意圖拍攝照片並將其保存到java.io.File

畫廊的東西正常工作,我可以得到他們選擇的照片,併發送沒有任何問題。但是在相機選項中,相機會打開,拍攝一張照片,並將其保存在SD卡上,並保存在我指定的位置,沒問題,但是當它返回到我的應用程序時,我總是得到NullPointerException,並且我的應用程序被強制關閉。這是我做的:

private String tempFilePath = "";  
... 
public void addPhotoUsingCamera() { 

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    tempFilePath = getOutputMediaFilePath(MEDIA_TYPE_IMAGE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(tempFilePath)));  
    startActivityForResult(intent, CAMERA_ACTIVITY_CODE); 
} 

然後我用下面進入拍攝的照片:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    switch (requestCode) { 
    ... 
    case CAMERA_ACTIVITY_CODE: 
     if (resultCode == Activity.RESULT_OK) {   
      picture = new File(tempFilePath); 
     } 
     break; 
    ... 
    } 
} 

我也試過

Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 
ImageView image = (ImageView) findViewById(R.id.photoTaken); 
image.setImageBitmap(thumbnail); 

case CAMERA_ACTIVITY_CODE:但無論我怎麼努力我在這部分代碼中總是得到一個NullPointerException。

有logcat信息,其中行202對應於case CAMERA_ACTIVITY_CODE:部分。

01-31 23:40:13.154: ERROR/AndroidRuntime(8009): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=101, result=-1, data=null} to activity {com.ollaa.android/com.ollaa.android.share.ShareFinalScreen}: java.lang.NullPointerException 

01-31 23:40:13.154: ERROR/AndroidRuntime(8009): Caused by: java.lang.NullPointerException 
01-31 23:40:13.154: ERROR/AndroidRuntime(8009):  at com.ollaa.android.share.ShareFinalScreen.onActivityResult(ShareFinalScreen.java:202) 

任何幫助,非常感謝。

注:我已經在AndroidManifest中聲明瞭與相機和SD卡相關的所有必要權限。

編輯:我意識到,tempFilePath不會持續,直到相機活動返回到我的應用程序。我在我的onCreate方法中初始化了tempFilePath,但是當我嘗試從onActivityResult以外的其他函數嘗試到達時,未設置此時間圖片。我覺得我根本不瞭解Java,當我們在一個函數內改變一個類變量時,改變後的值應該可以從該類的所有函數中看到。

回答

2

當使用:

intent.putExtra(MediaStore.EXTRA_OUTPUT,MYFILE);

該文件必須存在於'磁盤'上。相機活動不會創建它,這是恕我直言,錯誤。所以你必須使用myFile.createNewFile();
此外,你必須發送相機活動文件,而不是一個路徑。

嘗試這樣:

tempFilePath = getOutputMediaFilePath(MEDIA_TYPE_IMAGE); 
String fileName = "myPhoto"; 
File myFile = new File (tempFilePath,fileName); 
myFile.createNewFile(); 
// at this point stop the debugger and check if the file exists on the 'disk'. 
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(myFile))); 

可能有更好的方法來做到這一點,而無需使用MediaStore.EXTRA_OUTPUT。也許另一個用戶可以幫忙。

此外,請注意,如果用戶按下取消,並沒有拍照,你必須刪除該文件。

注意:我正在使用Android API 2.2。

我希望這會有所幫助。

+0

我嘗試了你的建議,但沒有任何區別。不管怎麼說,還是要謝謝你 :) – ecem 2012-02-01 00:36:18

相關問題