It can also be solved with SensorManager
. Here is a simple demo shows how to keep image orientation correct for locked activity to portrait:
MainActivity :
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Surface;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private ImageView img;
private SensorManager mSensorManager;
private Sensor mOrientation;
float value_0 = -10000;
float value_1 = -10000;
private SensorEventListener mOrientationSensorListener = new SensorEventListener() {
int orientation = -1;
@Override
public void onSensorChanged(SensorEvent event) {
int value ;
if(value_0 == event.values[0] && value_1==event.values[1]){
return;
}
// Log.d("values:", "values:" + event.values[0]+", "+event.values[1]);
if (event.values[1] > 0 && event.values[0] == 0) {
value = Surface.ROTATION_0;//portrait
if (orientation != value) {
updateImageRotation(value);
Log.d("orientation", "portrait + update");
}
orientation = value;
Log.d("orientation", "portrait ");
}
if (event.values[1] < 0 && event.values[0] == 0) {
value = Surface.ROTATION_180;//portrait reverse
if (orientation != value) {
updateImageRotation(value);
Log.d("orientation", "portrait reverse + update");
}
orientation = value;
Log.d("orientation", "portrait reverse");
}
if (event.values[0] > 0 && event.values[1] == 0) {
value = Surface.ROTATION_90;//portrait reverse
if (orientation != value) {
updateImageRotation(value);
Log.d("orientation", "landscape + update");
}
orientation = value;
Log.d("orientation", "landscape");
}
if (event.values[0] < 0 && event.values[1] == 0) {
value = Surface.ROTATION_270;//portrait reverse
if (orientation != value) {
updateImageRotation(value);
Log.d("orientation", "landscape + update");
}
orientation = value;
Log.d("orientation", "landscape reverse");
}
value_0=event.values[0];
value_1=event.values[1];
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img = (ImageView) findViewById(R.id.img);
// Get sensor manager
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// Get the default sensor of specified type
mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
@Override
protected void onResume() {
super.onResume();
if (mOrientation != null) {
mSensorManager.registerListener(mOrientationSensorListener, mOrientation,
SensorManager.SENSOR_DELAY_GAME);
}
}
@Override
protected void onPause() {
super.onPause();
if (mOrientation != null) {
mSensorManager.unregisterListener(mOrientationSensorListener);
}
}
private void updateImageRotation(int degree) {
switch (degree) {
case Surface.ROTATION_0:
img.setRotation(0);
break;
case Surface.ROTATION_90:
img.setRotation(90);
break;
case Surface.ROTATION_180:
img.setRotation(180);
break;
case Surface.ROTATION_270:
img.setRotation(270);
break;
}
}
}
In manifest. Orientation is locked to portrait
and sensor is required as feature
manifest.xml :
<?xml version="1.0" encoding="utf-8"?>
<manifest package="permissionsmngr.com.apipas.rotationmanage"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-feature
android:name="android.hardware.sensor.accelerometer"
android:required="true"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:screenOrientation="portrait"
>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
activity_main.xml :
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:id="@+id/activity_main"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="permissionsmngr.com.apipas.rotationmanage.MainActivity">
<ImageView
android:layout_centerInParent="true"
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"
/>
</RelativeLayout>