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

相关问题