使用androidx.window时一加、OPPO设备Android13+系统崩溃
问题描述
在非折叠屏的一加、OPPO设备(仅Android 13及以上系统)中,添加折叠屏识别逻辑后应用出现崩溃。
涉及代码
private WindowInfoTrackerCallbackAdapter windowInfoTracker; private final Consumer<WindowLayoutInfo> layoutStateChangeCallback = new LayoutStateChangeCallback(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_epub_reader); windowInfoTracker = new WindowInfoTrackerCallbackAdapter(WindowInfoTracker.getOrCreate(this)); } @Override protected void onStart() { super.onStart(); if (Utilities.isFoldableDevice(this)) { Timber.tag(TAG).d("onStart: isFoldableDevice"); windowInfoTracker.addWindowLayoutInfoListener(this, Runnable::run, layoutStateChangeCallback); } } @Override protected void onStop() { super.onStop(); if (Utilities.isFoldableDevice(this)) { windowInfoTracker.removeWindowLayoutInfoListener(layoutStateChangeCallback); } } class LayoutStateChangeCallback implements Consumer<WindowLayoutInfo> { @Override public void accept(WindowLayoutInfo newLayoutInfo) { EpubReaderActivity.this.runOnUiThread(() -> { try { boolean isDeviceFlatFoldable = !newLayoutInfo.getDisplayFeatures().isEmpty(); Timber.tag(TAG).d("accept: isDeviceFlatFoldable = %s", isDeviceFlatFoldable); if (preferencesManager.getIsDeviceFlatFoldable() != isDeviceFlatFoldable) { preferencesManager.setIsDeviceFlatFoldable(isDeviceFlatFoldable); EventBus.getDefault().post(new EpubColumnsChangeEvent()); } } catch (Exception e) { Timber.e(e); } }); } } public static boolean isFoldableDevice(Context context) { // at least Android 11 (Version code 30) is required if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_SENSOR_HINGE_ANGLE); } return false; }
依赖配置
implementation 'androidx.window:window-java:1.3.0'
崩溃日志
Fatal Exception: java.lang.AbstractMethodError: abstract method "void androidx.window.sidecar.SidecarInterface$SidecarCallback.onDeviceStateChanged(androidx.window.sidecar.SidecarDeviceState)" at androidx.window.sidecar.StubSidecar.updateDeviceState(StubSidecar.java:64) at androidx.window.sidecar.SampleSidecarImpl.onDisplayFeaturesChanged(SampleSidecarImpl.java:78) at androidx.window.sidecar.SampleSidecarImpl.-$$Nest$monDisplayFeaturesChanged() at androidx.window.sidecar.SampleSidecarImpl$NotifyOnConfigurationChanged.onDisplayFeaturesChangedForActivity(SampleSidecarImpl.java:194) at androidx.window.sidecar.SampleSidecarImpl$NotifyOnConfigurationChanged.onActivityCreated(SampleSidecarImpl.java:182) at android.app.Application.dispatchActivityCreated(Application.java:388) at android.app.Activity.dispatchActivityCreated(Activity.java:1430) at android.app.Activity.onCreate(Activity.java:1758) at androidx.core.app.ComponentActivity.onCreate(ComponentActivity.java:88) at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:363) at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:273) at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:65347) at com.yit.evrit.viewer.BaseActivity.onCreate(BaseActivity.kt:37) at com.yit.evrit.viewer.BaseActivity.onCreate(BaseActivity.kt:216) at com.yit.evrit.reader.BaseReaderActivity.onCreate(BaseReaderActivity.java:78) at com.yit.evrit.reader.BaseReaderActivity.onCreate(BaseReaderActivity.java:259) at com.yit.evrit.reader.epub.ui.main_screen.EpubReaderActivity.onCreate(EpubReaderActivity.java:461) at com.yit.evrit.reader.epub.ui.main_screen.EpubReaderActivity.onCreate(EpubReaderActivity.java:1665) at android.app.Activity.performCreate(Activity.java:8757) at android.app.Activity.performCreate(Activity.java:8729) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1475) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4005) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4181) at android.app.ActivityThread.handleRelaunchActivityInner(ActivityThread.java:6349) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:6219) at android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItem.java:76) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:144) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:101) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2643) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:257) at android.os.Looper.loop(Looper.java:368) at android.app.ActivityThread.main(ActivityThread.java:8839) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:572) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)
解决方案
崩溃原因是androidx.window:window-java:1.3.0版本与一加、OPPO的Android 13+系统存在兼容性问题,系统调用了库中未实现的onDeviceStateChanged抽象方法。可通过以下步骤修复:
升级window库版本
将依赖升级到最新稳定版(如1.10.0),新版本修复了此类厂商兼容性问题:implementation 'androidx.window:window-java:1.10.0'优化折叠屏判断逻辑
原有仅通过FEATURE_SENSOR_HINGE_ANGLE判断不够全面,结合系统DisplayFeature检测更准确:public static boolean isFoldableDevice(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); DisplayFeature[] features = display.getDisplayFeatures(); // 检测是否存在折叠或铰链相关的显示特征 for (DisplayFeature feature : features) { if (feature.getType() == DisplayFeature.TYPE_FOLD || feature.getType() == DisplayFeature.TYPE_HINGE) { return true; } } // 回退到传感器判断逻辑 return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_SENSOR_HINGE_ANGLE); } return false; }增加初始化及回调的异常防护
避免初始化WindowInfoTracker时崩溃,同时在生命周期方法中增加空判断:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_epub_reader); try { windowInfoTracker = new WindowInfoTrackerCallbackAdapter(WindowInfoTracker.getOrCreate(this)); } catch (Exception e) { Timber.e(e, "Failed to initialize WindowInfoTracker"); windowInfoTracker = null; } } @Override protected void onStart() { super.onStart(); if (windowInfoTracker != null && Utilities.isFoldableDevice(this)) { Timber.tag(TAG).d("onStart: isFoldableDevice"); windowInfoTracker.addWindowLayoutInfoListener(this, Runnable::run, layoutStateChangeCallback); } } @Override protected void onStop() { super.onStop(); if (windowInfoTracker != null && Utilities.isFoldableDevice(this)) { windowInfoTracker.removeWindowLayoutInfoListener(layoutStateChangeCallback); } }
内容的提问来源于stack exchange,提问作者OShiffer
相关产品推荐
相关产品推荐

