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()");
	}

}