【问题标题】:Android Tablet Take Picture Camera Intent Activity RestartsAndroid 平板电脑拍照相机 Intent Activity 重启
【发布时间】:2014-09-18 12:25:35
【问题描述】:

在我的应用程序中,有一个从相机拍照的选项。我的FragmentActivity 仅在纵向模式下运行。在我的Fragment 中,当用户点击按钮时,我使用以下方式启动相机应用:

private void pickFromCamera() {

    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    try {
        File file = new File(createImageFile());
        if(!file.exists()) {
            file.createNewFile();
        }
        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
    } catch (Exception e) {
        e.printStackTrace();
    }
    startActivityForResult( intent , ACTION_REQUEST_CAMERA );

}

在片段的onActivityResult 中,我正在这样做:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    try {
        super.onActivityResult(requestCode, resultCode, data);
        if ( resultCode == Activity.RESULT_OK ) {
            switch ( requestCode ) {
            case ACTION_REQUEST_GALLERY:
                .....
            case ACTION_REQUEST_CAMERA:

                if(cameraImageFilePath == null) {
                // show error message and return
                }
                addImage(cameraImageFilePath);
                break;

            }
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

但我在这里遇到了奇怪的问题。在手机上,它可以正常工作。在平板电脑上,当以横向模式拍摄照片并从相机应用程序点击保存按钮时,它可以工作。但是如果我纵向拍照并按下保存按钮,我的应用程序就会崩溃。这是 logcat 的输出:

    09-18 17:00:09.960: E/AndroidRuntime(13701): FATAL EXCEPTION: main
09-18 17:00:09.960: E/AndroidRuntime(13701): java.lang.RuntimeException: Unable to resume activity {com.dstudios.napa/com.dstudios.napa.HomeActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=196708, result=-1, data=null} to activity {com.dstudios.napa/com.dstudios.napa.HomeActivity}: java.lang.NullPointerException
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2291)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2319)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1839)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3191)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.access$600(ActivityThread.java:122)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1031)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.os.Looper.loop(Looper.java:132)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.main(ActivityThread.java:4126)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at java.lang.reflect.Method.invokeNative(Native Method)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at java.lang.reflect.Method.invoke(Method.java:491)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at dalvik.system.NativeStart.main(Native Method)
09-18 17:00:09.960: E/AndroidRuntime(13701): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=196708, result=-1, data=null} to activity {com.dstudios.napa/com.dstudios.napa.HomeActivity}: java.lang.NullPointerException
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.deliverResults(ActivityThread.java:2821)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2278)
09-18 17:00:09.960: E/AndroidRuntime(13701):    ... 13 more
09-18 17:00:09.960: E/AndroidRuntime(13701): Caused by: java.lang.NullPointerException
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:152)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.Activity.dispatchActivityResult(Activity.java:4581)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.deliverResults(ActivityThread.java:2817)

然后我在 FragmentActivity 中添加了 onActivityResult 方法,并用 try catch 块包围了 super 调用:

@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
    // TODO Auto-generated method stub
    try {
        super.onActivityResult(arg0, arg1, arg2);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

现在发生的是异常被捕获并且没有崩溃,但我的活动正在重新启动。我知道有一种方法可以使用 onSavedInstanceState 保存活动的状态,然后......但是我的活动非常复杂,它无法恢复到以前的状态,因为它是主要活动并且加载了很多片段等等。 ..有什么解决方法吗? 我正在使用具有 Android HoneyComb 3.2 的三星 10 英寸平板电脑。 编辑: 另外,我在清单中添加了android:configChanges="orientation"

【问题讨论】:

    标签: android android-activity android-fragments camera tablet


    【解决方案1】:

    它不会破坏变量。但是经过这么多天的研究LOL,我已经解决了我的错误。当我放置调试器时,该方法会像拍照后一样调用它。

    onCreate() onActivityResult() onCate() onResume() 只需将以下几行放入清单中即可解决。这是由于相机配置更改和窗口软输入模式而发生的。

             <activity
                android:name="packageName.Activity"
                android:configChanges="orientation|keyboardHidden|screenSize"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:windowSoftInputMode="adjustResize" >
    

    【讨论】:

      【解决方案2】:

      不,您无法保证您的活动在失去屏幕后不会立即被破坏。当由于相机应用程序请求横向而切换方向时,确实会更频繁地发生这种情况,但您无法控制这种情况。用户可以选择再运行一项后台服务,或者使用自定义的 IMAGE_CAPTURE 提供程序,这将烧毁你所有的卡片。另见https://stackoverflow.com/a/20783313/192373

      如果您不能选择onSaveInstanceState(Bundle)(或者即使您可以),如果您提供应用内相机,尤其是在带有片段的平板电脑上,它可能会为您的用户提供更好的体验。

      【讨论】:

      • 你说得对,亚历克斯。我已经通过创建自己的相机实现和拍照来解决它。
      猜你喜欢
      • 2012-03-24
      • 2016-06-09
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多