android 屏幕方向监听,android 屏幕旋转问题 - jwzhangjie的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

settings设置

在Android的Settings-> Display中有Orientation这一设置项。当选中时,屏幕会随设备旋转。

settings设置是在文件SoundAndDisplaySettings.java中,该项对应的键字符串为:

private

static

finalString KEY_ACCELEROMETER ="accelerometer";

其默认值保存在xml文件中,默认是Enable。UI程序初始化时会根据其值是否在复选框中打勾(代码在onCreate函数中):

1.

protected

voidonCreate(Bundle savedInstanceState) {

2.…

3.mAccelerometer = (CheckBoxPreference) findPreference(KEY_ACCELEROMETER);

4.mAccelerometer.setPersistent(false);

5.…

6.}

当用户改变了该值时,会保存起来:

1.public

booleanonPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {

2.…

3.}else

if(preference == mAccelerometer) {

4.Settings.System.putInt(getContentResolver(),

5.Settings.System.ACCELEROMETER_ROTATION,

6.mAccelerometer.isChecked() ?1:0);

7.…

8.}

frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java中的SettingsServer会随时监控其值,对用户设置做出反应:

1.public

voidupdate() {

2.ContentResolver resolver = mContext.getContentResolver();

3.

booleanupdateRotation =false;

4.

synchronized(mLock) {

5.…

6.

intaccelerometerDefault = Settings.System.getInt(resolver,

7.Settings.System.ACCELEROMETER_ROTATION, DEFAULT_ACCELEROMETER_ROTATION);

8.

if(mAccelerometerDefault != accelerometerDefault) {

9.mAccelerometerDefault = accelerometerDefault;

10.updateOrientationListenerLp();

11.}

12.…

13.}

G-sensor屏幕旋转

WindowOrientationListener

frameworks/base/core/java/android/view/WindowOrientationListener.java中会监听Sensor的值,对旋转方向进行判断,然后调用抽象方法onOrientationChanged,因此,只要在子类Listener中重新实现这个函数即可对四个不同方向做出响应 。

PhoneWindowManager

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java有个Listener

MyOrientationListener

mOrientationListener

MyOrientationListener  继承了WindowOrientationListener类

它会根据Sensor判别出的旋转方向,调用WindowManagerService::setRotation让屏幕进行旋转。

class MyOrientationListener extends WindowOrientationListener {               MyOrientationListener(Context context) {                super(context);           }

@Override         public void onOrientationChanged(int rotation) {            // Send updates based on orientation value

if (localLOGV) Log.v(TAG, "onOrientationChanged, rotation changed to " +rotation);             try {

mWindowManager.setRotation(rotation, false,                        mFancyRotationAnimation);             } catch (RemoteException e) {                // Ignore             }           }                                              }

MyOrientationListener mOrientationListener;

当应用程序显示禁止屏幕旋转时则不会旋转,见函数PhoneWindowManager ::needSensorRunningLp()。

最后通过代码来实现自动屏幕旋转这个功能

先判断是否打开:

需要导入的包为:import android.provider.Settings;

在还得在manifest里面设置android:configChanges="orientation|keyboardHidden"

android:screenOrientation="user"

并且要加上权限:

android.permission.WRITE_SETTINGS

代码为:

int flag =Settings.System.getInt(context.getContentResolver(),Settings.System.ACCELEROMETER_ROTATION, 0);

打开关闭,关闭打开:

Settings.System.putInt(context.getContentResolver(),Settings.System.ACCELEROMETER_ROTATION,flag==1?0:1);

你可能感兴趣的:(android,屏幕方向监听)