Android开发sensor旋转屏问题解决示例

2023-12-05 0 691
目录
  • 一、查询 activity xml 配置screenOrientation信息:
  • 二、事件发生时间点分析:
  • 三、logcat查看sensor激活状态:
    • 状态栏–控制按钮–“方向锁定” 开启时,en=0 即 sensor关闭!
  • 四、查看APP是否注册旋转屏sensor
    • 五、sensorservice 信息
      • bugreport dumpsys sensorservice信息查看 注册的sensor信息
      • 相关sensor:
      • bugreport device_orient 信息查看上报事件
    • 六、有现场,查看当前activity信息
      • logcat查看当前activity: 有很多其他日志可供查看
      • 根据DUMP OF SERVICE usagestats:内容 查看时间点的APP
      • 现场,命令方式查询当前activity:
      • 查看包信息
      • 查看apk内部 AndroidManifest.xml
    • 七、App写旋转屏的几种方式:
      • 八、bugreport 中 mUserRotation 信息
        • 九、setting信息查询 没大用,只能查当前信息
          • 十、用户点击状态栏“锁定旋转”行为分析:
            • 十一、app调用 setRequestedOrientation 请求变更activity方向配置
              • X、一些知识点:

            一、查询 activity xml 配置screenOrientation信息:

            找个测试机器,安装此APP。as中 devices explorer界面中打开此apk安装目录,双击apk。或者把apk托到as中,在反编译的资产xml文件搜索此activity,并查看 android:screenOrientation 属性。或者使用 aapt dump xmltree 命令查看。

            configChanges 属性是为了防止重启activity

            <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服务的信息倒推事件发生时间点

            三、logcat查看sensor激活状态:

            此log是高通 sensors-hal 层打印的

            状态栏–控制按钮–“方向锁定” 开启时,en=0 即 sensor关闭!

            /vendor/qcom/proprietary/sensors-see/sensors-hal-2.0/framework/sensors_hal.cpp

            logcat中搜索 device_orientation

            2021-08-09 17:07:23.037 1021-1021/? I/sensors-hal: activate:209, android.sensor.device_orientation/272 en=1
            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注册的是加速度sensor,使用自己的算法计算

            APP注册 android.view.OrientationEventListener 回调,自身代码调节旋转Demo:

            private void registerOrientation(){
            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();
            }

            五、sensorservice 信息

            DUMP OF SERVICE CRITICAL sensorservice:

            bugreport dumpsys sensorservice信息查看 注册的sensor信息

            Previous Registrations:
            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

            相关sensor:

            // 加速计传感器 handle: 0x0100000b
            // 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 |

            bugreport device_orient 信息查看上报事件

            # 0 表示通常的正常
            # 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,

            六、有现场,查看当前activity信息

            logcat查看当前activity: 有很多其他日志可供查看

            07-31 17:50:25.687563 4486 4486 D Nav_RecentsImpl: onResumed className=com.miui.gallery.activity.ExternalPhotoPageActivity,mIsInAnotherPro=false,isKeyguardLocked=false,mNavStubView=com.miui.home.recents.NavStubView{f994da4 G.E…… ……I. 0,0-1080,35}

            根据DUMP OF SERVICE usagestats:内容 查看时间点的APP

            time=\”2021-07-08 09:29:02\” type=ACTIVITY_PAUSED package=com.ainemo.dragoon class=com.meeting.call.activity.XylinkMeetingActivity instanceId=40437940 taskRootPackage=com.ainemo.dragoon taskRootClass=com.ainemo.android.activity.MainActivity flags=0x0
            log的结尾:
            In-memory daily stats
            timeRange=\”2021/8/21 08:14–18:08\”
            packages

            现场,命令方式查询当前activity:

            adb shell dumpsys window | findstr mCurrentFocus
            dumpsys window | grep mCurrentFocus

            查看包信息

            adb shell dumpsys package com.eg.android.AlipayGphone
            $ 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 ]

            查看apk内部 AndroidManifest.xml

            aapt dump xmltree C:\\Users\\lish\\Desktop\\test.apk AndroidManifest.xml

            七、App写旋转屏的几种方式:

            三种方式做旋转屏:

            大部分都是直接使用系统控制的,就是SystemServer进程注册的 com.android.server.policy.WindowOrientationListener 监听,然后直接控制APP的界面旋转,这个使用的 device_orient sensor。 但是因手机不同,厂商不同,有些竖直反向的旋转,系统不准旋转。

            // frameworks/base/services/core/java/com/android/server/wm/DisplayRotation.java
            // 内部类: 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直接使用 地磁+加速度 传感器

            八、bugreport 中 mUserRotation 信息

            adb shell dumpsys window displays

            dumpsys window displays | grep DisplayRotation -A 30

            文件中搜索 mUserRotation=

            WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
            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

            九、setting信息查询 没大用,只能查当前信息

            D:\\&gt;adb shell \”dumpsys settings | grep rotation\”
            _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 中:

            DUMP OF SERVICE settings:

            十、用户点击状态栏“锁定旋转”行为分析:

            • 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{\”内置屏幕\”, displayId 0, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, real 1080 x 2400, largest app 2320 x 2276, smallest app 1080 x 956, appVsyncOff 1000000, presDeadline 13333332, mode 3, defaultMode 1, modes [{id=1, width=1080, height=2400, fps=60.000004}, {id=2, width=1080, height=2400, fps=144.00002}, {id=3, width=1080, height=2400, fps=120.00001}, {id=4, width=1080, height=2400, fps=90.0}], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[2, 3, 4], mMaxLuminance=420.0, mMaxAverageLuminance=210.1615, mMinLuminance=0.323}, minimalPostProcessingSupported false, rotation 0, state ON}, DisplayMetrics{density=2.75, width=1080, height=2276, scaledDensity=2.75, xdpi=394.705, ydpi=394.307}, isValid=true
            2021-08-22T13:15:03.023 – Screen on for display=Display id 0: DisplayInfo{\”内置屏幕\”, displayId 0, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, real 1080 x 2400, largest app 2320 x 2276, smallest app 1080 x 956, appVsyncOff 1000000, presDeadline 13333332, mode 3, defaultMode 1, modes [{id=1, width=1080, height=2400, fps=60.000004}, {id=2, width=1080, height=2400, fps=144.00002}, {id=3, width=1080, height=2400, fps=120.00001}, {id=4, width=1080, height=2400, fps=90.0}], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[2, 3, 4], mMaxLuminance=420.0, mMaxAverageLuminance=210.1615, mMinLuminance=0.323}, minimalPostProcessingSupported false, rotation 0, state ON}, DisplayMetrics{density=2.75, width=1080, height=2276, scaledDensity=2.75, xdpi=394.705, ydpi=394.307}, isValid=true
            2021-08-22T13:15:42.385 – Wifi (default) connected
            ……………
            ++++++++++++++++++++++++++++++++
            TransportManager:

            • bugreport 搜索 BUFFER QSLog:
            • 分析 用户点击 “方向锁定” 时间点
            • 现场执行命令: dumpsys activity service com.android.systemui/.dump.SystemUIAuxiliaryDumpService

            BUFFER QSLog:
            ============================================================================
            12-22 14:48:42.160 V QSLog: [custom(com.miui.securitycenter/com.miui.superpower.notification.SuperPowerTileService)] Tile updated. Label=超级省电. State=1. Icon=null.
            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似乎未起作用

            十一、app调用 setRequestedOrientation 请求变更activity方向配置

            需要自己写打点log

            X、一些知识点:

            亮屏是否默认开启旋转屏sensor: 锁定旋转后,device_orient 这个sensor是否一直处于 enable状态,google 默认开启

            /frameworks/base/core/java/android/provider/Settings.java

            /**
            * The default state of SHOW_ROTATION_SUGGESTIONS.
            * @hide
            */
            public static final int SHOW_ROTATION_SUGGESTIONS_DEFAULT =
            // SHOW_ROTATION_SUGGESTIONS_ENABLED;
            SHOW_ROTATION_SUGGESTIONS_DISABLED;

            以上就是Android开发sensor旋转屏问题解决示例的详细内容,更多关于Android sensor旋转屏的资料请关注悠久资源网其它相关文章!

            您可能感兴趣的文章:

            • Android进程间大数据通信LocalSocket详解
            • Android性能优化getResources()与Binder导致界面卡顿优化
            • AndroidStudiogradle配置packagingOptions打包so库重复
            • Android APP瘦身shrinkResources使用问题详解
            • AndroidNDK开发中SO包大小压缩方法详解
            • Android对so进行简单hook思路解析

            收藏 (0) 打赏

            感谢您的支持,我会继续努力的!

            打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
            点赞 (0)

            悠久资源 ASP编程 Android开发sensor旋转屏问题解决示例 https://www.u-9.cn/biancheng/asp/96017.html

            常见问题

            相关文章

            发表评论
            暂无评论
            官方客服团队

            为您解决烦忧 - 24小时在线 专业服务