2013-05-01 22 views
3

我在接收从我开发的相机意图中捕获的数据时遇到了问题。我已经使用了android API指南中的代码。任何人都可以告诉我哪里出错了?我可以看到LogCat打印输出中的参数who=nulldata=null可能会导致错误,但我不确定这是为什么。Android onActivityResult()在图像捕获时返回NullPointerException

相机活动

//ESSENTIAL VARIABLES - DD - 29/04/2013 
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100; 
private static final int MEDIA_TYPE_IMAGE = 1; 
private Uri fileUri; 
MenuItem item; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_snap_camera); 

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
} 

/** 
* Gets the OutputMediaFileUri and accepts media type as a parameter 
* @param type 
* @return 
*/ 
private static Uri getOutputMediaFileUri(int type) { 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

/** 
* Method taking media type as a parameter and will save images taken to a public directory on users' device. 
* @param type 
* @return 
*/ 
private static File getOutputMediaFile(int type){ 

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "CrowdSnapCymru"); 

    if(!mediaStorageDir.exists()){ 
     if(! mediaStorageDir.mkdirs()){ 
      Log.d("CrowdSnapCymru", "failed to create photo directory"); 
      return null; 
     } 
    } 

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile; 
    if(type == MEDIA_TYPE_IMAGE){ 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); 
    } 
    else{ 
     return null; 
    } 

    return mediaFile; 

} 

/** 
* Receives the result of Camera intent. 
*/ 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
     if(resultCode == RESULT_OK){ 
      Toast.makeText(this, "Image saved to: \n" + data.getData() , Toast.LENGTH_LONG).show(); 
     } 
     else if(resultCode == RESULT_CANCELED){ 
      Toast.makeText(this, "User canceled the image capture", Toast.LENGTH_LONG).show(); 
     } 
     else { 
      Toast.makeText(this, "Image capture failed. Please try again", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

的代码加载相机应用程序,如果我取消应用程序将产生的成功的结果,但如果我接受图像或RESULT_OKAYNullPointerException被产生。

logcat的打印输出

05-01 09:57:48.894: E/AndroidRuntime(974): FATAL EXCEPTION: main 
05-01 09:57:48.894: E/AndroidRuntime(974): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null} to activity {rcahmw.prototype.crowdsnapcymru/rcahmw.prototype.crowdsnapcymru.SnapCamera}: java.lang.NullPointerException 
05-01 09:57:48.894: E/AndroidRuntime(974): at android.app.ActivityThread.deliverResults(ActivityThread.java:3319) 
05-01 09:57:48.894: E/AndroidRuntime(974): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3362) 
05-01 09:57:48.894: E/AndroidRuntime(974): at android.app.ActivityThread.access$1100(ActivityThread.java:141) 
05-01 09:57:48.894: E/AndroidRuntime(974): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282) 
05-01 09:57:48.894: E/AndroidRuntime(974): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-01 09:57:48.894: E/AndroidRuntime(974): at android.os.Looper.loop(Looper.java:137) 
05-01 09:57:48.894: E/AndroidRuntime(974): at android.app.ActivityThread.main(ActivityThread.java:5041) 
05-01 09:57:48.894: E/AndroidRuntime(974): at java.lang.reflect.Method.invokeNative(Native Method) 
05-01 09:57:48.894: E/AndroidRuntime(974): at java.lang.reflect.Method.invoke(Method.java:511) 
05-01 09:57:48.894: E/AndroidRuntime(974): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
05-01 09:57:48.894: E/AndroidRuntime(974): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
05-01 09:57:48.894: E/AndroidRuntime(974): at dalvik.system.NativeStart.main(Native Method) 
05-01 09:57:48.894: E/AndroidRuntime(974): Caused by: java.lang.NullPointerException 
05-01 09:57:48.894: E/AndroidRuntime(974): at rcahmw.prototype.crowdsnapcymru.SnapCamera.onActivityResult(SnapCamera.java:84) 
05-01 09:57:48.894: E/AndroidRuntime(974): at android.app.Activity.dispatchActivityResult(Activity.java:5293) 
05-01 09:57:48.894: E/AndroidRuntime(974): at android.app.ActivityThread.deliverResults(ActivityThread.java:3315) 

任何意见将是辉煌的。在Android中使用Camera应用程序非常新颖。

回答

1

尝试按照下面的方法在文件URI后面传递EXTRA_OUTPUT。你onCreate会是什么样子:

Uri picUri; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_snap_camera); 
    String imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/picture.jpg"; 
    File imageFile = new File(imageFilePath); 
    picUri = Uri.fromFile(imageFile); // convert path to Uri   
    intent.putExtra(MediaStore.EXTRA_OUTPUT, picUri); 
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
} 

然后onActivityResult使用picUri访问图像。在您的活动中声明picUri作为实例变量。因此,将在onActivityResult

+0

你能提供一个例子吗?我看到你的逻辑,但实现很混乱。 – WebDevDanno 2013-05-01 11:04:55

+0

例子是什么?我的意思是你想要达到什么? – hemu 2013-05-01 11:09:26

+0

如何访问'onActivityResult'中的'picUri'图像。对不起,真的很新鲜。 – WebDevDanno 2013-05-01 11:11:25

3

地方保存了fileURI变量,并用它在onActivityResult而不是data.getData

相关问题