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
相关产品推荐
相关产品推荐

