【问题标题】:Android onActivityResult() returning NullPointerException on image captureAndroid onActivityResult() 在图像捕获时返回 NullPointerException
【发布时间】:2013-05-01 10:01:16
【问题描述】:

我无法从我开发的相机意图接收数据捕获。我使用了 android API 指南中的代码。谁能告诉我哪里出错了?我可以看到 LogCat 打印输出中的 who=nulldata=null 参数可能会导致错误,但我不确定这是为什么。

相机活动

//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_OKAY,则会产生NullPointerException

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 中使用相机应用程序非常新。

【问题讨论】:

    标签: java android image nullpointerexception


    【解决方案1】:

    将您的 fileUri 变量保存在某处并在 onActivityResult 中使用它而不是 data.getData

    【讨论】:

      【解决方案2】:

      尝试将以下文件 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 中提供

      【讨论】:

      • 你能举个例子吗?我明白你的逻辑,但实现令人困惑。
      • 什么例子??我的意思是你想达到什么目标??
      • 如何访问onActivityResult 中的picUri 图像。对不起,这真的很新。
      • 哦……明白了……请参阅上面的编辑答案……将picUri声明为您的活动中的实例变量。
      • 谢谢 :) 然后我想我可以调用data.getExtras() 来获取onActivityResult() 中的变量
      猜你喜欢
      • 1970-01-01
      • 2013-07-23
      • 2015-09-03
      • 1970-01-01
      • 2017-02-09
      • 2014-11-19
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多