0

我通过 Intent 使用相机拍摄图像,然后将其保存到图像视图中。意图相机处于横向模式,它返回的活动处于纵向模式。所以活动改变了方向并重新加载了一个新的活动。我正在尝试将此图像保存在该图像视图中。但是,在返回到活动页面时,一旦活动处于纵向模式,它就会消失。当我添加 onSaveInstanceState 方法时,它会因错误而崩溃:

  Canvas: trying to use a recycled bitmap android

我添加了以下代码:

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_page);
    imageView = (ImageView) findViewById(R.id.result);
    if(savedInstanceState != null){
        Bitmap photo = savedInstanceState.getParcelable("savedImage");
        imageView.setImageBitmap(photo);
        }

  }

我已将图像保存如下

protected void onSaveInstanceState(Bundle icicle){
      super.onSaveInstanceState(icicle);
      imageView.buildDrawingCache();
      Parcelable bm = imageView.getDrawingCache();
      icicle.putParcelable("savedImage",bm);
  }
4

1 回答 1

1

画布错误是因为在方向更改后位图不再存在。此外,您在 onSavedInstanceState() 中设置的 Parcelable 可能不存在。可以这样想:视图在逻辑上比意图和回调结果“更高级别”。

在用它填充视图之前,您可以将图像从相机保存到文件系统。

所以,更多的家务。这就是我在几个生产/发布的应用程序中所做的......并且可能有更好的方法(?)

  1. 在触发相机意图之前提前定义一个文件(路径和名称) 。
  2. 触发相机,通过传递给 onActivityResult() 的 intent->data 参数获取其位图图像
  3. 仍然在 onActivityResult 中,将位图放入 View AND
  4. 然后将其写入已知文件(并关闭它)。

请注意,在第 2 步和第 3 步之间,您可以压缩位图以节省空间。

为了处理重新定向,在 onStart 或 onResume 中有一个例程 - 在 onCreate() 之后被触发:

  1. 尝试打开那个已知文件
  2. 如果失败或没有数据:

    然后使用一些默认图像(可能是 RES jpg),

    else 文件和它的图像是好的:将文件中的图像放入 imageView

  3. 关闭文件。

这样,无论发生什么,您都可以在其中放入一些东西。大多数时候,它按预期工作 :)) (他说在几乎折断 4 个人的手腕后高速翻转安卓手机大声笑)

顺便说一句 - 这个问题可能会进一步复杂化,因为相机硬件因供应商而异。一些设备在相机处理之前、期间和之后都保持相同的方向。其他人,比如一些(或全部?)较新的三星,无论你做什么,都会翻转相机方向(除非你放弃硬件——这要复杂得多)。

您遇到问题的设备是三星吗?- 请注意,它们会引起更多的头痛。

于 2013-09-03T21:15:12.843 回答