当我试图从用相机拍摄的照片中获取Uri时,我得到了null

时间:2012-03-19 18:31:39

标签: android image camera save

这是我的问题,当我试图从我拍摄的照片中获取Uri时我会在模拟器和我的设备上使用相机获取null,但如果我使用其他相机应用程序,则只能使用系统相机,作品。这是我的代码

启动相机应用程序

takePic.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    String captured_image = System.currentTimeMillis() + ".jpg";
    File file = new File(Environment.getExternalStorageDirectory(), captured_image); 
    captured_image = file.getAbsolutePath();
    outputFileUri = Uri.fromFile(file); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
    intent.putExtra("return-data", true);
    startActivityForResult(intent, CAMERA_REQUEST);
   }
});

获取图片

protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  if (requestCode == CAMERA_REQUEST) { 
    ContentResolver cr = getContentResolver();
    InputStream in = null;
    try 
    {
        in = cr.openInputStream(outputFileUri); 
    } 
    catch (FileNotFoundException e) 
    {
        e.printStackTrace();
    }
  }
}

当活动返回时,outputFileUri始终为null。 感谢。

2 个答案:

答案 0 :(得分:10)

Android可能会在您进入onActivityResult之前杀死(并重新启动)您的活动,例如因为您在拍摄照片时旋转了设备。尝试使用其余的活动状态存储和恢复outputFileUri ...

protected void onSaveInstanceState(Bundle outState)
{
    outState.putParcelable("outputFileUri", outputFileUri);
}

...

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    if (savedInstanceState != null)
    {
        outputFileUri= savedInstanceState.getParcelable("outputFileUri");
    }
}

答案 1 :(得分:0)

我认为这个问题与您在标准Android活动生命周期中管理outputFileUri成员var有关。

当您调用StartActivityForResult时,您的活动将停止并可能已被破坏。当捕获意图返回时,您的活动将被重新创建并恢复。您可能需要在这些生命周期事件中持久保存outputFileUri的值。

请参阅onCreateonSaveInstanceState

我唯一的探索是为什么原生应用程序在第三方相机应用程序没有做到这一点时,不知何故本机人员消耗资源到你的活动实际上被破坏的程度,消灭你的outputFileUri。

除了检查uri / filepath以查看实际捕获的图像之外,还可能值得查看onActivityResult中返回的结果代码以确保相机意图显示OK。我打赌它确实如此。