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);