文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android开发sensor旋转屏问题如何解决

2023-07-05 10:36

关注

这篇文章主要讲解了“Android开发sensor旋转屏问题如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android开发sensor旋转屏问题如何解决”吧!

一、查询 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=12021-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=0us17: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.accelerometerpublic static final int TYPE_ACCELEROMETER = 1;  0x0100000b) lsm6dso Accelerometer Non-wakeup | STMicro         | ver: 142870 | type: android.sensor.accelerometer(1) | perm: n/a | flags: 0x00000980continuous | 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: 0x00000980continuous | 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: 0x00000000continuous | maxDelay=0us | maxRate=415.97Hz | no batching | non-wakeUp | // 方向传感器---用户app旋转屏   handle:0x0100010f// android.sensor.device_orientationpublic 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: 0x00000002on-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: 0x00000003on-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 mCurrentFocusdumpsys window | grep  mCurrentFocus

查看包信息

adb shell dumpsys package com.eg.android.AlipayGphone$ adb shell dumpsys package com.android.stkPackages:  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.OrientationListenerprivate class OrientationListener extends WindowOrientationListener//  在systemserver进程中是通过 com.android.server.wm.DisplayRotation$OrientationListener 操作

八、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:

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

分析用户旋转屏时间点

      ++++++++++++++++++++++++++++++++      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:
    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].

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

需要自己写打点log

X、一些知识点:

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

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

                public static final int SHOW_ROTATION_SUGGESTIONS_DEFAULT =                // SHOW_ROTATION_SUGGESTIONS_ENABLED;                SHOW_ROTATION_SUGGESTIONS_DISABLED;

感谢各位的阅读,以上就是“Android开发sensor旋转屏问题如何解决”的内容了,经过本文的学习后,相信大家对Android开发sensor旋转屏问题如何解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯