android 检测外接键盘并设置输入法布局

简介: android 检测外接键盘并设置输入法布局

需求:


接入外接键盘后, 系统输入语言自动变更为法语键盘


实现:


监听外接设备变更 > 查询是否包含全键盘设备 > 变更输入法布局


<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.SET_KEYBOARD_LAYOUT" />
<!-- 开机自动启动 -->
<receiver android:name=".Receiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
    <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.DEFAULT"/> 
            </intent-filter>
        </receiver>
<!-- 监听服务 -->
  <service android:name=".KeyboardService">
            <intent-filter>
    <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/> 
            </intent-filter>
        </service>


开机启动服务:


import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.zed.keyboardDeviceReceiver.*;
public class Receiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
  // TODO Auto-generated method stub
  Intent i = new Intent(context, KeyboardService.class);
  i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  context.startService(i);
  }
}
import android.app.Service;
import android.os.IBinder;
import android.content.Context;
import android.view.InputDevice;
import android.os.Handler;
import android.content.Intent;
import android.os.Message;
import android.content.res.Configuration;
import android.hardware.input.InputManager;
public class KeyboardService extends Service implements InputManager.InputDeviceListener{
  private InputManager mIm;
  private Context context;
  public void onCreate(){
  super.onCreate();
  context = getApplicationContext();
  }
  @Override
  public void onStart(Intent intent, int startId) {
  // TODO Auto-generated method stub
  super.onStart(intent, startId);
   mIm = (InputManager)context.getSystemService(Context.INPUT_SERVICE);
   mIm.registerInputDeviceListener(this, null);//添加监听
  int[] ids = mIm.getInputDeviceIds();//非常重要, 决定后续是否能监听到状态变化
  }
  @Override
  public void onConfigurationChanged(Configuration newConfig) {
  // TODO Auto-generated method stub
  //doNothing
android.util.Log.d("KeyboardService", "0410 onConfigurationChanged");
  }
  public void onDestroy(){
  super.onDestroy();
  mIm.unregisterInputDeviceListener(this);//注销监听
  }
  public IBinder onBind(android.content.Intent intent){
  return null;
  }
    public void onInputDeviceAdded(int deviceId){
android.util.Log.d("KeyboardService", "0410 > onInputDeviceAdded()");
  final int[] devices = InputDevice.getDeviceIds();//获取设备
  for (int i = 0; i < devices.length; i++) {//遍历查找
          InputDevice device = InputDevice.getDevice(devices[i]);
                if (device != null
                        && !device.isVirtual()
                        && device.isFullKeyboard()) {
                    final String inputDeviceDescriptor = device.getDescriptor();
                    final String keyboardLayoutDescriptor =
                            mIm.getCurrentKeyboardLayoutForInputDevice(inputDeviceDescriptor);
                    mIm.addKeyboardLayoutForInputDevice(inputDeviceDescriptor,
                            "com.android.inputdevices/com.android.inputdevices.InputDeviceReceiver/keyboard_layout_french");//添加布局
      mIm.setCurrentKeyboardLayoutForInputDevice(inputDeviceDescriptor,
                        "com.android.inputdevices/com.android.inputdevices.InputDeviceReceiver/keyboard_layout_french");//更改布局
                }
            }
  }
    public void onInputDeviceRemoved(int deviceId){
  android.util.Log.d("KeyboardService", "0410 > onInputDeviceRemoved()");
  }
    public void onInputDeviceChanged(int deviceId){
  android.util.Log.d("KeyboardService", "0410 > onInputDeviceChanged()");
  }
}
相关文章
|
10月前
|
Android开发 开发者
Android设置View是否可用
在Android开发中,有时需要将布局设置为不可点击状态(失去焦点)。常见的解决方法是使用`setOnClickListener(null)`,但本文介绍一种更通用的方式:通过封装`setViewEnabled`方法实现。该方法可递归设置View及其子View的启用状态,支持传入目标View和布尔值(`true`为可用,`false`为禁用)。例如,调用`setViewEnabled(edittext, false)`即可禁用EditText。文章附有源码及示例动图,帮助开发者快速理解与应用。
233 1
|
10月前
|
Android开发 开发者
Android中Dialog位置+样式的设置
本文介绍了在Android开发中如何设置Dialog的位置和样式。通过自定义`MyDialog`类,可以灵活调整Dialog的显示位置,例如将其固定在屏幕底部,并设置宽度匹配父布局。同时,文章还展示了如何模仿Android原生Dialog样式,通过定义`MyDialogStyle`去除标题栏、设置背景透明度、添加阴影效果以及配置点击外部关闭等功能,从而实现更加美观和符合需求的Dialog效果。代码示例详细,便于开发者快速上手实现。
559 2
|
设计模式 Java Android开发
安卓应用开发中的内存泄漏检测与修复
【9月更文挑战第30天】在安卓应用开发过程中,内存泄漏是一个常见而又棘手的问题。它不仅会导致应用运行缓慢,还可能引发应用崩溃,严重影响用户体验。本文将深入探讨如何检测和修复内存泄漏,以提升应用性能和稳定性。我们将通过一个具体的代码示例,展示如何使用Android Studio的Memory Profiler工具来定位内存泄漏,并介绍几种常见的内存泄漏场景及其解决方案。无论你是初学者还是有经验的开发者,这篇文章都将为你提供实用的技巧和方法,帮助你打造更优质的安卓应用。
|
Android开发
Android经典实战之Textview文字设置不同颜色、下划线、加粗、超链接等效果
本文介绍了 `SpannableString` 在 Android 开发中的强大功能,包括如何在单个字符串中应用多种样式,如颜色、字体大小、风格等,并提供了详细代码示例,展示如何设置文本颜色、添加点击事件等,助你实现丰富文本效果。
1247 4
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
770 0
|
XML 前端开发 Android开发
android 前端常用布局文件升级总结(二)
android 前端常用布局文件升级总结(二)
164 0
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
1043 0
|
XML 前端开发 Android开发
android 前端常用布局文件升级总结(一)
android 前端常用布局文件升级总结(一)
178 0
|
Android开发
【Android 安装包优化】Tint 着色器 ( 简介 | 布局文件中的 Tint 着色器基本用法 | 代码中使用 Tint 着色器添加颜色效果 )(二)
【Android 安装包优化】Tint 着色器 ( 简介 | 布局文件中的 Tint 着色器基本用法 | 代码中使用 Tint 着色器添加颜色效果 )(二)
417 0
【Android 安装包优化】Tint 着色器 ( 简介 | 布局文件中的 Tint 着色器基本用法 | 代码中使用 Tint 着色器添加颜色效果 )(二)

热门文章

最新文章