解决安卓多屏模式输入法报错Display must not be null

输入法服务的启动流程:
输入法服务InputMethodService在应用进程创建时同时创建,
输入法应用程序(Latin IME)需要继承系统的InputMethodService服务,
服务创建过程中会创建绑定Context上下文,过程中会获取display信息。

在这里插入图片描述

最终会在DisplayManagerService中获取Display信息:
在这里插入图片描述

frameworks/base/services/core/java/com/android/server/display/DisplayManagerService.java:893

对比HDMI类型副屏发现Build-in类型副屏中DisplayInfo的flags被设置为
Display.FLAG_PRIVATE,导致getDisplayInfoInternal函数返回null,最终导致输入法服务启动报错。

查找赋值flags的代码如下,只有build-in类型的屏幕在初始化时会将flags默认赋值为FLAG_PRIVATE类型,设置vendor.display.builtin_presentation属性为true修改默认值。该属性设置后副屏可配置输入法,虚拟按键等功能。
在这里插入图片描述

frameworks/base/services/core/java/com/android/server/display/LocalDisplayAdapter.java:606

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 9 实现副屏输入法显示,可以通过以下步骤: 1. 在 AndroidManifest.xml 文件声明一个具有 android.permission.WRITE_SECURE_SETTINGS 权限的服务。 ```xml <manifest> <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> <application> <service android:name=".YourServiceName" android:permission="android.permission.BIND_INPUT_METHOD"> <meta-data android:name="android.view.im" android:resource="@xml/method" /> <meta-data android:name="android.permission" android:value="android.permission.WRITE_SECURE_SETTINGS" /> <intent-filter> <action android:name="android.view.InputMethod" /> </intent-filter> </service> </application> </manifest> ``` 2. 创建一个自定义的输入法服务 YourServiceName,并在 onCreate() 方法调用 setSecureSetting() 方法设置 secure_setting_show_ime_with_hard_keyboard 值为 1。 ```java public class YourServiceName extends InputMethodService { @Override public void onCreate() { super.onCreate(); // 设置 secure_setting_show_ime_with_hard_keyboard 值为 1 setSecureSetting(Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD, "1"); } private void setSecureSetting(String key, String value) { try { ContentResolver resolver = getContentResolver(); Settings.Secure.putString(resolver, key, value); } catch (Exception e) { Log.e(TAG, "Failed to set secure setting", e); } } } ``` 3. 在 res/xml 目录下创建 method.xml 文件,并指定输入法对应的键盘布局。 ```xml <input-method xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="YourSettingsActivityName" android:canRequestEnhancedWebAccessibility="true" android:canRequestFilterKeyEvents="true" android:inputMethod="YourInputMethodName" android:label="YourLabelName"> <subtype android:label="YourSubtypeName" android:imeSubtypeLocale="YourSubtypeLocale" android:imeSubtypeMode="YourSubtypeMode" android:imeSubtypeExtraValue="YourSubtypeExtraValue" android:isAsciiCapable="true" /> </input-method> ``` 4. 在 AndroidManifest.xml 文件声明一个 SettingsActivity,并在 onCreate() 方法调用 setResult() 方法以返回结果。 ```xml <activity android:name=".YourSettingsActivityName" android:exported="true" android:label="YourSettingsActivityLabel"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> ``` ```java public class YourSettingsActivityName extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setResult(Activity.RESULT_OK); finish(); } } ``` 通过以上步骤,即可在 Android 9 实现副屏输入法显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值