【问题标题】:Galaxy S3 - taking picture in portrait mode destroys activityGalaxy S3 - 以人像模式拍照会破坏活动
【发布时间】:2013-04-22 18:37:11
【问题描述】:

所以,这个问题已经在这个论坛上以多种形式提出,但没有一个答案对我有帮助。我有一个只能在三星 Galaxy S3 上重现的错误。

我想简单地使用手机的相机拍摄并存储一张照片,但在我收到 onActivityResult 的回复之前,我的 Activity 已被销毁。只有当我在纵向模式下使用相机时才会发生这种情况,在横向模式下就可以了。

我正在使用此代码启动相机:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, Config.ACTIVITY_TAKE_PHOTO);

在纵向模式下,我从未看到对 onActivityResult 的调用(来自相机活动),我只看到在启动活动中调用了 onDestroy()。日志中没有异常或错误,也没有明显的错误导致它崩溃。

我看到一些帖子建议将“android:configChanges="orientation|keyboardHidden"” 添加到清单中,并做很多其他事情来管理使用相机时发生的方向变化,但到目前为止没有任何帮助.

其他人解决了这个问题吗?

【问题讨论】:

  • developer.android.com/reference/android/hardware/…。您可以设置显示方向。我有一个 Galaxy s3,我使用了开发者网站上的代码。我无法复制您面临的问题。但是我遇到了一个不同的问题,显示方向是纵向,图像被捕获但保存的图像被旋转。
  • 您应该阅读此讨论并意识到如果您看到 onDestroy(),Android 并没有杀死您的进程。别的东西做了。请阅读并吸收 Activity 生命周期文档,并意识到 android:configChanges="orientation|keyboardHidden 是一个隐藏许多罪孽(错误)的黑客,除非你真正理解它。 groups.google.com/forum/?fromgroups=#!topic/android-platform/…
  • Simon,您对如何获取有关我的活动的 onDestroy() 的更多信息有什么建议吗?有什么办法可以打印出更详细的堆栈跟踪吗?
  • Thread.currentThread().getStackTrace()
  • 所以听起来我应该停止担心防止屏幕方向改变和导致活动破坏,而更多地关注在每次图像捕获后从 onDestroy 中优雅地恢复?

标签: android android-activity camera galaxy


【解决方案1】:

如果您的目标超出 API 级别 13,添加

android:configChanges="orientation|keyboardHidden"

到 Manifest 是不够的。

查看来自Android documentation的摘录

注意:如果您的应用程序以 API 级别 13 或更高级别为目标(由 minSdkVersion 和 targetSdkVersion 属性声明),那么您还应该声明“screenSize”配置,因为当设备在纵向和横向之间切换时它也会改变。

因此尝试添加

android:configChanges="orientation|keyboardHidden|screenSize"

到您的清单文件。这应该可以解决您的问题。

【讨论】:

  • 这对我很有用
  • @dishan 我理解了方向和 screenSize 标志,但是为什么要使用keyboardHidden?
  • @TashPemhiwa 是的,对于这个特定的问题,keyboardHidden 可能没有效果。因此android:configChanges="orientation|screenSize" 也应该可以工作。但是再次包含keyboardHidden 将为您提供额外的保护,因为它还可以防止您的活动在键盘可用性更改事件中重新启动。 orientationkeyboardHidden 是 Android 中最常用的配置更改,人们希望在不重新启动 Activity 的情况下自行处理。因此,拥有keyboardHidden 将是明智之举。
【解决方案2】:

Android 在某些场景下可以调用 destroy() 方法。一种是当我们使用方法finish() 时。另一种方法是使用 Activity 类的 isFinishing () 方法。如果真的是finalized就可以finalize自己的资源,否则,你可以把值保留分配一个继承Application的类

@Override
protected void onDestroy() {

    final YourApp app = (YourApp) getApplicationContext();
    if (app != null && isFinishing()) {
        app.finalizeAppResources();
    }

    // ...

    super.onDestroy();
}

【讨论】:

    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多