拦截Android上Camera应用程序的onActivityResult()

时间:2012-04-07 16:31:07

标签: android android-intent null camera

在我的应用程序中,我正在努力让用户按下一个按钮,这样他们就可以使用手机上的相机应用程序拍照。

我正在遵循使用外部相机应用程序从Android开发人员指南(http://developer.android.com/guide/topics/media/camera.html)捕获我可以在自己的应用中使用的图像的指南#意向接收)

我遇到了onActivityResult()方法的问题,它显然需要3个参数

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if(resultCode == RESULT_OK) {
            Log.w("borre","Image saved to:\n" + data.getData());
        } else if (resultCode == RESULT_CANCELED) {
            // User cancelled the image capture
        } else {
            // Image capture failed, advise user
        }
    }
}

但目前,数据Intent将返回null,因此调用Intent参数上的任何方法都会抛出NullPointerException

这是我用来调用Camera应用程序的代码(它与指南中的代码基本相同)

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

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

startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

有没有人遇到过这个问题,或者知道为什么这个Intent会以null返回?

2 个答案:

答案 0 :(得分:4)

你的数据部分是空的,因为你在启动Acitivty时没有设置intent.setDataAndType()

    public static final String IMAGE_UNSPECIFIED = "image/*"; 
    Intent intent = new Intent(Intent.ACTION_PICK, null);  
    intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);  
    startActivityForResult(intent, 3);  

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == 0)  
       return; 
    if (requestCode == 2) {  
       Uri uri=data.getData();  //YOU GET DATA HERE
        }  
//OR
if (requestCode == 3) {  
 Bundle extras = data.getExtras();  
 if (extras != null) {  
 Bitmap photo = extras.getParcelable("data");  
 ByteArrayOutputStream stream = new ByteArrayOutputStream();  
 photo.compress(Bitmap.CompressFormat.JPEG, 75, stream);// (0 - 100)????  
 imageView.setImageBitmap(photo);  
  }  
}  

或在您的情况下使用图像路径:

if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {  
     //pic path
      File picture = new File(Environment.getExternalStorageDirectory() + "/temp.jpg");  
   } 

答案 1 :(得分:0)

在类范围声明imageUri = null ...

使用下面的代码并尝试::

takephoto.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Calendar cal = Calendar.getInstance();
        File file = new File(Environment.getExternalStorageDirectory(),(cal.getTimeInMillis()+".jpg"));
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else {
            file.delete();
            try {
                file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        imageUri = Uri.fromFile(file);
        Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        i.putExtra(MediaStore.EXTRA_OUTPUT, selectedImageUri);
        startActivityForResult(i, 0);
    }
});

这里也是onactivityresult方法:::

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case 0:
            if (resultCode == RESULT_OK) {
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), imageUri);
                    //imageVIew.setImageBitmap(bitmap);
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            break;
    }
}