You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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抽象方法。可通过以下步骤修复:

  1. 升级window库版本
    将依赖升级到最新稳定版(如1.10.0),新版本修复了此类厂商兼容性问题:

    implementation 'androidx.window:window-java:1.10.0'
    
  2. 优化折叠屏判断逻辑
    原有仅通过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;
    }
    
  3. 增加初始化及回调的异常防护
    避免初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:45:55