问题
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