Android:使用相机意图拍摄照片并将其保存到java.io.File

时间:2012-01-31 22:10:11

标签: android file nullpointerexception android-camera android-camera-intent

我正在尝试从用户那里获取图片,然后将其发送到我们的服务器。我提供了两个选项:从图库中选择或使用手机中的默认相机拍摄新照片。

图库的功能正常,我可以获得他们选择的照片并发送它没有任何问题。但是在相机选项中,相机打开,拍照,用我指定的位置保存在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不会持续到相机活动返回到我的应用程序。我将tempFilePath的初始化放在我的onCreate方法中,但是当我尝试从onActivityResult以外的外部函数到达时,这个时间图片没有设置。我觉得我根本不懂Java,当我们在一个函数中更改一个类变量时,更改的值应该可以从该类的所有函数中看到吗?

1 个答案:

答案 0 :(得分:2)

使用时:

intent.putExtra(MediaStore.EXTRA_OUTPUT,myFile);

该文件必须存在于'磁盘'上。 Camera Activity不会创建它,这是恕我直言的一个错误。所以你必须使用myFile.createNewFile();
此外,您必须向Camera Activity发送文件而不是路径。

尝试这样的事情:

 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。

我希望这会有所帮助。