使用FileProvider用相机捕获图像,如何存储uri

时间:2018-07-23 09:51:17

标签: android android-camera android-fileprovider

我遵循了thisthisthis之类的教程,内容涉及如何使用FileProvider用相机拍摄照片并将其存储在临时文件中以供以后上传。 / p>

他们都生成一个文件,使用文件提供程序获取uri,然后使用此uri调用CAmera意图:

 val intent = Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE)
        if (uri != null) {
            try {
                if (intent.resolveActivity(activity.packageManager) != null) {
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri)
                    activity.startActivityForResult(intent, resultCode)
                }
            } catch (t: Throwable) {
                Timber.e(t, t.message)
            }
        }

然后在onActivityResult上,他们使用以下方法获取图像:

 @Override
protected void onActivityResult(int requestCode, int resultCode,
                                              Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE) {
           //don't compare the data to null, it will always come as  null because we are providing a file URI, so load with the imageFilePath we obtained before opening the cameraIntent
        Glide.with(this).load(imageFilePath).into(mImageView);   
        // If you are using Glide.
    }
}

因此引用本教程“加载在打开cameraIntent之前获得的imageFilePaht”。

在大多数情况下都可以使用,但是当我出于某种原因尝试使用模拟器时,启动相机应用程序时,我的活动被破坏了(可能是内存不足),当我从相机回来时,我对Uri的引用为空。

我可以从活动结果中检索此Uri吗?还是我真的必须将其存储在sharedpreferences或类似的文件中?

1 个答案:

答案 0 :(得分:1)

  

当我从相机回来时,我对Uri的引用为空

Uri保存在已保存的实例状态Bundle中,无论任何活动或片段正在调用startActivity()来启动ACTION_IMAGE_CAPTURE应用。有关执行此操作的ACTION_IMAGE_CAPTURE请求的完整实现,请参见this sample app