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

Android11运行OmniNotes报非视觉Context访问UI常量错误如何解决

问题根因

该报错是Android 11新增的系统限制:非可视化Context(如Application全局Context)不允许访问UI相关常量、WindowManager等和屏幕显示强绑定的服务,必须使用Activity、或者通过createWindowContext创建的可视化Context执行这类操作。原项目基于Android 8开发,当时还没有该限制,所以留下了适配问题。

修复方案

1. 修复BaseActivity报错

错误行代码错误使用了全局ApplicationContext获取ViewConfiguration,直接替换为当前Activity的Context即可:

// 原错误代码
// ViewConfiguration config = ViewConfiguration.get(this.getApplicationContext());
// 修改后代码
ViewConfiguration config = ViewConfiguration.get(this);

BaseActivity本身继承自Activity,this就是合法的可视化Context,完全满足系统要求,原有强制显示菜单溢出按钮的逻辑也不会受影响。

2. 修复MainActivity报错

报错出现在super.onCreate行是因为主题设置顺序错误:原代码先执行父类onCreate再设置主题,父类初始化过程中需要读取窗口相关配置,此时主题未加载会导致系统 fallback 到全局Context读取UI参数触发报错。只需要调整两行代码的顺序即可,修改后完整的onCreate代码如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    // 把setTheme移到super.onCreate之前
    setTheme(R.style.OmniNotesTheme_ApiSpec);
    super.onCreate(savedInstanceState);

    // 后续原有代码保持不变
    binding = ActivityMainBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);

    EventBus.getDefault().register(this);
    Prefs.getPreferences().registerOnSharedPreferenceChangeListener(this);

    initUI();

    if (IntroActivity.mustRun()) {
        startActivity(new Intent(getApplicationContext(), IntroActivity.class));
    }
}
适配验证

修改完成后重新编译运行,两处报错都会消失,所有原有功能正常可用,兼容Android 8到最新版本的Android系统。

内容的提问来源于stack exchange,提问作者Phúc Bảo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:54:04