4

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?

Mat
  • 202,337
  • 40
  • 393
  • 406
Tere
  • 245
  • 1
  • 3
  • 14

3 Answers3

7

Use :

mCamera.stopPreview();
mCamera.setDisplayOrientation(mRotation);
mCamera.startPreview();
pprados
  • 1,127
  • 12
  • 21
  • I'm doing this, and it still happens. – aaronsnoswell Nov 07 '12 at 05:10
  • I was getting this error as well as issuing mCamera.stopPreview(). I was puzzled until scrolling further up the logcat message and finding a reference to resizing of the SurfaceView. Something about unable to resize to requested size. I took the Weight parameter out of my surface view and gave it a fixed size and this cured the error. – wufoo Mar 14 '13 at 19:37
2

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

GivenJazz
  • 2,641
  • 2
  • 12
  • 4
1

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.

Aaron
  • 323
  • 3
  • 10