【问题标题】:Restore image to ImageView on Orientation Changed在方向更改时将图像恢复到 ImageView
【发布时间】:2014-05-30 22:15:00
【问题描述】:

我正在编写一个简单的应用程序,通过调用相机的Intent 将图像设置为ImageView。但是当我改变方向时,图像消失了。我已经尝试过这个问题Q1Q2。前面的问题建议使用onSaveInstanceState在配置更改期间保留对象

但在Android docs我读过:

您可能会遇到重新启动应用程序和恢复大量数据的成本可能会导致用户体验不佳的情况

所以,如果 Bitmap 被认为是“大量数据”,我将需要使用 setRetainInstance,但在文档中说:

虽然您可以存储任何对象,但绝不应传递与 Activity 绑定的对象,例如 Drawable、Adapter、View 或与 Context 关联的任何其他对象

我应该使用什么方法来恢复方向变化的图像?

到目前为止我做了什么

private ImageView mPhotoImgage;
private Bitmap mCameraData;

onCreate {
    mPhotoImgage = (ImageView) findViewById(R.id.photoResultImage);

    if (savedInstanceState != null){
        mPhotoImgage.setImageBitmap((Bitmap)savedInstanceState.getParcelable(IMAGE_RESOURCE));
    }
}

onResume{
    if (mCameraData != null){
        mPhotoImgage.setImageBitmap(mCameraData);
    }
    super.onResume();
}

onSaveInstanceState{
    outState.putParcelable(IMAGE_RESOURCE, mCameraData);
    super.onSaveInstanceState(outState);
}

但经过两次方向更改后,图像消失了。

【问题讨论】:

    标签: android bitmap orientation-changes


    【解决方案1】:

    您可以改为让相机将捕获的图像保存到外部存储(如果可用)的文件中。你告诉它在哪里保存图像,这意味着你可以将文件 URI 存储在 onSaveInstanceState 中,并在恢复状态时从该 URI 加载它。

    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(context.getExternalFilesDir(null), "randomfilename")));
    startActivityForResult(cameraIntent, RC_CAMERA);
    

    您应该跟踪何时不再需要该文件并将其删除。

    这种方法的另一个优点是您可以在图像被加载到内存之前找出它的尺寸。

    【讨论】:

    • 我不知道为什么把这行putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(this.getCacheDir(), "randomfilename"))) 让相机应用程序永远不会返回。我拍了一张照片,接受照片并关闭相机应用程序的按钮没有任何作用
    • 我已编辑我的答案以删除使用应用程序缓存的建议,这是私有的,因此相机无法写入。应该可以授予许可,但我没能成功。您发布的代码不完整,但我认为您可能没有在onCreate 中设置mCameraData,这可以解释为什么图像在第二次方向更改时消失。
    • 我现在在onActivityResult 上检索数据时得到一个 NPE,我应该在那里用mPhotoImgage.setImageURI((Uri)data.getExtras().get("data")) 检索照片
    • 据我所知,意图数据中不会返回URI(调试确认),您需要记住您在意图中发送的URI,并将其存储在片段或活动中, 在方向改变后使用onSaveInstanceState恢复它。
    • 好的,谢谢,我去试试
    【解决方案2】:

    您应该使用 onResume 方法在活动恢复时设置您的图像

    @Override
    protected void onResume() {
        //your code here
        super.onResume();
    }
    

    您不需要保存的实例,只需复制您在 onCreate 上使用的代码以将您的图像设置为 onResume,它应该可以工作。

    例如,如果您有 onCreate :

     imageView im.setImageResource(R.drawable.image);
    

    将它用于 onResume :

    @Override
    protected void onResume() {
        imageView im.setImageResource(R.drawable.image);
        super.onResume();
    }
    

    【讨论】:

    • 我正在使用data.getExtras().get("data")通过相机获取图像。
    • 您可以尝试将图像保存为 jpeg 并加载它。我给你一个链接来下载我的一个简单的测试项目,看看如何在不打开相机应用程序的情况下捕获 jpeg。根据需要使用代码并对其进行修改以执行您需要的操作4shared.com/rar/v-ZQPybcce/Test.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多