Problem with camera when orientation changes

北城以北 提交于 2019-12-23 14:58:09

问题


I'm doing an application that calls a different activity when the device orientation changes from landscape to portrait or viceversa. The activity for the landscape mode is an augmented reality one, so I use the camera to show the surroundings to the user. However, when I try to go back to portrait, the app crashes and displays this error:

08-17 16:05:42.622: ERROR/AndroidRuntime(9769): FATAL EXCEPTION: main
08-17 16:05:42.622: ERROR/AndroidRuntime(9769): java.lang.RuntimeException: set display orientation failed
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.hardware.Camera.setDisplayOrientation(Native Method)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at es.ucm.look.ar.Preview.surfaceChanged(Preview.java:102)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.view.SurfaceView.updateWindow(SurfaceView.java:549)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.view.SurfaceView.setFrame(SurfaceView.java:294)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.view.View.layout(View.java:7169)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.view.View.layout(View.java:7175)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.view.View.layout(View.java:7175)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.view.View.layout(View.java:7175)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1140)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.os.Looper.loop(Looper.java:130)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at android.app.ActivityThread.main(ActivityThread.java:3683)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at java.lang.reflect.Method.invokeNative(Native Method)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at java.lang.reflect.Method.invoke(Method.java:507)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-17 16:05:42.622: ERROR/AndroidRuntime(9769):     at dalvik.system.NativeStart.main(Native Method)

The change from portrait to landscape works normally.

This is my android manifest (the activity "EmergenciesList" is the one for portrait mode, and "MapaMovilAR" for lanscape):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.list" android:versionCode="1" android:versionName="1.0">
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:icon="@drawable/icon" android:label="@string/app_name"
    android:name="cl.puc.memoria.MapaMovilApplication">
    <activity android:name="cl.puc.memoria.EmergenciesList"
        android:configChanges="orientation" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"></action>
            <category android:name="android.intent.category.LAUNCHER">    </category>
        </intent-filter>
    </activity>
    <activity android:name="cl.puc.memoria.AR.MapaMovilAR"
        android:configChanges="orientation">
    </activity>
    <activity android:name="es.ucm.look.ar.LookAR"></activity>

</application>
<uses-sdk android:minSdkVersion="7" />

</manifest> 

And finally this is the code for handling the orientation change:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Intent el = new Intent(MapaMovilAR.this,
                cl.puc.memoria.EmergenciesList.class);
        startActivity(el);
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

Is there anything that could be causing the crash?


回答1:


Use :

mCamera.stopPreview();
mCamera.setDisplayOrientation(mRotation);
mCamera.startPreview();



回答2:


Camera.setDisplayOrientation only can use 0, 90, 180, 270




回答3:


there's usually a "caused by" line in the logcat error readout, can you see if it's there and include it if it is? It will help provide more insight.

When an orientation change happens the activity is killed. My initial guess is that you are setting some value that is not longer valid when you return to portrait mode. You can used the savedInstanceState bundle to pass along and persist these changes.



来源:https://stackoverflow.com/questions/7099032/problem-with-camera-when-orientation-changes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!