找个测试机器,安装此APP。as中 devices explorer界面中打开此apk安装目录,双击apk。或者把apk托到as中,在反编译的资产xml文件搜索此activity,并查看 android:screenOrientation 属性。或者使用 aapt dump xmltree 命令查看。
configChanges 属性是为了防止重启activity
android:theme=”@ref/0x7f130170″
android:label=”@ref/0x7f1200c6″
android:name=”com.miui.gallery.activity.ExternalPhotoPageActivity”
android:screenOrientation=”4″
android:configChanges=”0xda0″
android:showWhenLocked=”true”>
事件发生时间点=录屏文件名的时间 + 录屏发生时视频经过的秒数
结合问题描述和usagestats服务的信息倒推事件发生时间点
此log是高通 sensors-hal 层打印的
/vendor/qcom/proprietary/sensors-see/sensors-hal-2.0/framework/sensors_hal.cpp
logcat中搜索
2021-08-09 17:07:23.048 1021-1021/? I/sensors-hal: activate:220, android.sensor.device_orientation/272 en=1 completed
有的APP注册的是加速度sensor,使用自己的算法计算
APP注册 android.view.OrientationEventListener 回调,自身代码调节旋转Demo:
OrientationEventListener orientationListener=new OrientationEventListener(this) {
@Override
public void onOrientationChanged(int orientation) {
Log.d(TAG, “onOrientationChanged: ” + orientation);
if (orientation==OrientationEventListener.ORIENTATION_UNKNOWN) {
return; // 手机平放时,检测不到有效的角度
}
// 设置竖屏
if (((orientation >=0) && (orientation <=30)) || (orientation >=330)) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
// 设置横屏
else if (((orientation >=230) && (orientation <=310))) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
};
orientationListener.enable();
}
DUMP OF SERVICE CRITICAL sensorservice:
17:57:12 + 0x0000002d pid=20420 uid=10265 package=android.view.OrientationEventListener samplingPeriod=200000us batchingPeriod=0us
17:57:12 + 0x0000002d pid=20420 uid=10265 package=android.view.OrientationEventListener samplingPeriod=200000us batchingPeriod=0us
// app通常会注册回调 android.view.OrientationEventListener 此类内部注册了 加速计sensor,用来监听旋转角度
// android.sensor.accelerometer
public static final int TYPE_ACCELEROMETER=1;
0x0100000b) lsm6dso Accelerometer Non-wakeup | STMicro | ver: 142870 | type: android.sensor.accelerometer(1) | perm: n/a | flags: 0x00000980
continuous | minRate=1.00Hz | maxRate=415.97Hz | FIFO (max,reserved)=(10000, 3000) events | non-wakeUp |
highest rate level=3, support shared mem: gralloc,
0x0100015f) lsm6dso Accelerometer-Uncalibrated Non-wakeup | STMicro | ver: 142870 | type: android.sensor.accelerometer_uncalibrated(35) | perm: n/a | flags: 0x00000980
continuous | minRate=1.00Hz | maxRate=415.97Hz | FIFO (max,reserved)=(10000, 3000) events | non-wakeUp |
highest rate level=3, support shared mem: gralloc,
0x5f676273) Gyroscope Bias (debug) | AOSP | ver: 1 | type: android.sensor.accelerometer(1) | perm: n/a | flags: 0x00000000
continuous | maxDelay=0us | maxRate=415.97Hz | no batching | non-wakeUp |
// 方向传感器—用户app旋转屏 handle: 0x0100010f
// android.sensor.device_orientation
public static final int TYPE_DEVICE_ORIENTATION=27;
0x0100010f) device_orient Non-wakeup | xiaomi | ver: 1 | type: android.sensor.device_orientation(27) | perm: n/a | flags: 0x00000002
on-change | maxDelay=0us | minDelay=0us | FIFO (max,reserved)=(10000, 0) events | non-wakeUp |
// 其 Wakeup handle: 0x01000110 com.android.server.policy.WindowOrientationListener 注册此类型
0x01000110) device_orient Wakeup | xiaomi | ver: 1 | type: android.sensor.device_orientation(27) | perm: n/a | flags: 0x00000003
on-change | maxDelay=0us | minDelay=0us | FIFO (max,reserved)=(10000, 0) events | wakeUp |
# 1 表示顺时针旋转90度
device_orient Wakeup: last 10 events
1 (ts=68477.447943014, wall=17:49:58.724) 0.00,
2 (ts=68478.554363222, wall=17:49:59.831) 0.00,
3 (ts=68478.989033691, wall=17:50:00.265) 0.00,
4 (ts=68479.423711660, wall=17:50:00.701) 1.00,
5 (ts=68482.743111608, wall=17:50:04.022) 0.00,
6 (ts=68486.101931400, wall=17:50:07.379) 0.00,
7 (ts=68495.309003118, wall=17:50:16.585) 0.00,
8 (ts=68505.308247806, wall=17:50:26.584) 1.00,
9 (ts=68507.166153170, wall=17:50:28.444) 0.00,
10 (ts=68513.214244108, wall=17:50:34.491) 0.00,
log的结尾:
In-memory daily stats
timeRange=”2021/8/21 08:14–18:08″
packages
dumpsys window | grep mCurrentFocus
$ adb shell dumpsys package com.android.stk
Packages:
Package [com.android.stk] (ac39f18):
userId=1001
sharedUser=SharedUserSetting{411f5ce android.uid.phone/1001}
pkg=Package{fde9cef com.android.stk}
codePath=/system/app/Stk
resourcePath=/system/app/Stk # apk 安装包位置
legacyNativeLibraryDir=/system/app/Stk/lib
extractNativeLibs=true
primaryCpuAbi=null
secondaryCpuAbi=null
cpuAbiOverride=null
versionCode=31 minSdk=31 targetSdk=31
minExtensionVersions=[]
versionName=12 # 版本号
usesNonSdkApi=true
splits=[base]
apkSigningVersion=3
applicationInfo=PackageImpl{fde9cef com.android.stk}
flags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
privateFlags=[ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION ALLOW_AUDIO_PLAYBACK_CAPTURE DEFAULT_TO_DEVICE_PROTECTED_STORAGE DIRECT_BOOT_AWARE PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING ]
forceQueryable=false
queriesPackages=[]
dataDir=/data/user_de/0/com.android.stk # 数据目录
supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity] ############
timeStamp=2009-01-01 08:00:00
firstInstallTime=2009-01-01 08:00:00 # 首次安装时间
lastUpdateTime=2009-01-01 08:00:00 # 上次更新时间
signatures=PackageSignatures{573d3fc version:3, signatures:[b4addb29], past signatures:[]}
installPermissionsFixed=false
pkgFlags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
三种方式做旋转屏:
大部分都是直接使用系统控制的,就是SystemServer进程注册的 com.android.server.policy.WindowOrientationListener 监听,然后直接控制APP的界面旋转,这个使用的 device_orient sensor。 但是因手机不同,厂商不同,有些竖直反向的旋转,系统不准旋转。
// 内部类: DisplayRotation.OrientationListener
private class OrientationListener extends WindowOrientationListener
// 在systemserver进程中是通过 com.android.server.wm.DisplayRotation$OrientationListener 操作
因此,大部分视频app又会独立注册 android.view.OrientationEventListener 监听,这个监听直接使用的加速度sensor(android.sensor.accelerometer) 这个sensor直接返回0~360度的角度。然后APP根据角度,自己控制旋转。此时“方向锁定”不起作用。app直接使用 地磁+加速度 传感器
adb shell dumpsys window displays
dumpsys window displays | grep DisplayRotation -A 30
文件中搜索 mUserRotation=
DisplayRotation
mCurrentAppOrientation=SCREEN_ORIENTATION_PORTRAIT
mLastOrientation=1
mRotation=0 mDeferredRotationPauseCount=0
mLandscapeRotation=ROTATION_90 mSeascapeRotation=ROTATION_270
mPortraitRotation=ROTATION_0 mUpsideDownRotation=ROTATION_180
mSupportAutoRotation=true
WindowOrientationListener
mEnabled=false
mCurrentRotation=ROTATION_0
mSensorType=null
mSensor={Sensor name=”device_orient Wakeup”, vendor=”xiaomi”, version=1, type=27, maxRange=1.0, resolution=1.0, power=0.001, minDelay=0}
mRate=2
OrientationSensorJudge
mDesiredRotation=-1
mProposedRotation=-1
mTouching=false # 触摸屏幕情况下,不调用 DisplayRotation.java$OrientationListener 中的 onProposedRotationChanged 方法。即不会旋转
mTouchEndedTimestampNanos=617520702367 # 抬起手时,机器开机以来的时间 如果当前时间
mCarDockRotation=-1 mDeskDockRotation=-1
mUserRotationMode=USER_ROTATION_LOCKED mUserRotation=ROTATION_90 mAllowAllRotations=false # 正常 mUserRotationMode=USER_ROTATION_LOCKED mUserRotation=ROTATION_0
mDemoHdmiRotation=ROTATION_90 mDemoHdmiRotationLock=false mUndockedHdmiRotation=-1
mLidOpenRotation=-1
mFixedToUserRotation=false
_id:109 name:user_rotation pkg:android value:0 default:0 defaultSystemSet:true
_id:17 name:accelerometer_rotation pkg:android value:0 default:0 defaultSystemSet:true
# /frameworks/base/core/java/android/provider/Settings.java ACCELEROMETER_ROTATION
# 0 表示 加速度sensor 不会用于控制屏幕方向, 1 反之.
_id:108 name:hide_rotation_lock_toggle_for_accessibility pkg:com.android.systemui value:0 default:0 defaultSystemSet:true
bugreport 中:
bugreport 搜索 DeviceStateMonitor:
分析用户旋转屏时间点
DeviceStateMonitor:
mIsTetheringOn=false
mIsScreenOn=true
mIsCharging=false
mIsPowerSaveOn=false
mIsLowDataExpected=false
mIsCarModeOn=false
mUnsolicitedResponseFilter=127
mIsWifiConnected=true
mIsAlwaysSignalStrengthReportingEnabled=false
Local logs:
2021-08-22T13:15:02.576 – Screen on for display=Display id 0: DisplayInfo, isValid=true
2021-08-22T13:15:42.385 – Wifi (default) connected
……………
++++++++++++++++++++++++++++++++
TransportManager:
bugreport 搜索 BUFFER QSLog:分析 用户点击 “方向锁定” 时间点现场执行命令: dumpsys activity service com.android.systemui/.dump.SystemUIAuxiliaryDumpService
12-22 14:48:42.160 V QSLog: [custom(com.milink.service/com.milink.ui.service.MiLinkTileService)] Tile updated. Label=投屏. State=1. Icon=null.
12-22 14:48:42.160 V QSLog: [custom(com.miui.mishare.connectivity/.tile.MiShareTileService)] Tile updated. Label=小米互传. State=1. Icon=null.
12-22 16:50:34.787 VERBOSE QSLog [rotation] Tile updated. Label=方向锁定. State=2. Icon=ResourceIcon[resId=0x7f0805a0].
12-22 16:51:07.775 DEBUG QSLog [rotation] Tile clicked. StatusBarState=SHD. TileState=active
12-22 16:51:07.790 VERBOSE QSLog [rotation] Tile updated. Label=方向锁定. State=1. Icon=ResourceIcon[resId=0x7f0805a1].
Label=方向锁定. State=2 表示 锁定logcat 搜索 “ send click msg ” 状态栏点击事件android_util_SeempLog.cpp 这个高通的log似乎未起作用
需要自己写打点log
亮屏是否默认开启旋转屏sensor: 锁定旋转后,device_orient 这个sensor是否一直处于 enable状态,google 默认开启
/frameworks/base/core/java/android/provider/Settings.java
SHOW_ROTATION_SUGGESTIONS_DISABLED;
以上就是Android开发sensor旋转屏问题解决示例的详细内容,更多关于Android sensor旋转屏的资料请关注脚本之家其它相关文章!