需求:
接入外接键盘后, 系统输入语言自动变更为法语键盘
实现:
监听外接设备变更 > 查询是否包含全键盘设备 > 变更输入法布局
<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()");
}
}