【问题标题】:Camera or Gallery intent destroys old activity on some devices相机或画廊意图破坏某些设备上的旧活动
【发布时间】:2013-01-31 09:23:49
【问题描述】:

我正在开发使用 WebView 来显示其内容的应用程序。但是,它需要打开相机或画廊才能选择图片:

    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(cameraIntent, 1);

    Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(galleryIntent, 2);

它在大多数设备上都可以正常工作,但在 HTC One 和其他少数设备上,这两种意图都会破坏我的活动,因此在返回时会重新加载 webview。我在AndroidManifest.xml 中没有noHistory 标志。什么可能导致该问题?我可以避免在这里破坏我的活动吗?

【问题讨论】:

标签: android android-intent android-activity


【解决方案1】:

通常情况下,Android 会在其他应用运行时终止您的 Activity。

您必须在 onSaveInstanceState 中保存 Activity 状态,并且在重新创建 Activity 时在 onRestoreInstanceState 或 onCreate 中恢复状态。

要恢复 WebView 的状态,您可以使用 cookie 和会话并保存上次打开的 url。重新创建活动时,只需导航 WebView 最后保存的 url 并处理来自相机的结果。

【讨论】:

  • 我的问题是 WebView 正在加载一个巨大的网页,我不想在选择照片、打开浏览器等几秒钟后重新加载它。
【解决方案2】:
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 1);

通过查看您的代码,我可以判断您的座右铭是捕获图像并在以后使用它。

这是一个已知的错误,解决方案是您需要为您的应用程序创建一个单独的文件夹,并且在捕获之前您需要确保该文件已创建并且您为相机意图提供的路径相同

Uri uriSavedImage=Uri.fromFile(new File("/sdcard/seperate/newImage.png"));
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra("output", uriSavedImage);
startActivityForResult(cameraIntent, 1);

参考:image from camera intent issue in android

【讨论】:

    【解决方案3】:

    也许是个愚蠢的建议。 但是由于它被破坏了,这意味着设备内存不足。

    如果唯一的烦恼是 webview 重新加载,也许你可以通过缓存内容来解决这个问题?

    例如,在您的活动的 onStop() 方法中,获取 webview 的内容并将其存储在某处。临时文件,sqlite,...并在 onCreate 检查是否有缓存(可能还有多长时间),如果需要,将其放入 webview。

    从 webview 获取 html 代码的教程:http://lexandera.com/2009/01/extracting-html-from-a-webview/

    【讨论】:

    • 我制作了没有 WebView(只有一个按钮)的简单应用程序,它也在发生。
    • 是的,但在这种情况下,Android 重新创建 Activity 真的很重要吗?也可能是 Android 操作系统需要内存来打开相机应用程序。
    • 实际上它发生在每个新 Intent 之后 - 我无法想象它没有足够的内存来打开简单的新 Activity 而不会破坏旧的。
    • 你在 startActivity(intent) 之后是否调用了 finish()。当您调用 finish() 时,它会破坏活动。
    • 不,我不调用finish方法。正如我所说,它只发生在特定设备上。
    【解决方案4】:

    如果我没有错,您正在从设备打开相机。您是否检查过其他应用没有获取相机?您必须在开始相机活动之前获取相机其他一些使用相机实例的应用程序。您必须在 on destroyonstop 活动方法中释放相机实例,以便下次它可以使用其他应用程序使用它或供您的应用程序使用。

    【讨论】:

      猜你喜欢
      • 2016-07-07
      • 2011-07-10
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多