как изменить язык раскладки клавиатуры usb с помощью InputMethodService?

У меня смарт тв на киткат андроид, хочу подключить usb клавиатуру и настроить сочетания клавиш как в винде, чтобы не испытывать дискомфорта от неудобных (стандартных) сочетаний клавиш, а так же хочу добавить свои реализации функций, недоступных в приложениях, доступных в Google Play.

Пробовал ставить сочетания клавиш через следующие программы: 1.External Keyboard Helper Pro В этом приложении переключение языков сделано как мне нужно, но приложение не знает на сколько, все остальные функции удалось реализовать, но есть без переключения языка.2.Button Mapper: переназначить ваши клавиши приложение требует включения специальных возможностей, но прошивка смарт тв урезана и нет возможности включить специальные возможности.

Поэтому пишу свою заявку, так как есть необходимость и желание двигаться в этом направлении.

Решил сделать свое приложение, но столкнулся с проблемой переключения раскладки клавиатуры

      public class ServiceIME1
extends InputMethodService{
private static final String TAG = ServiceIME.class.getSimpleName();
private static int pair[] = new int[2];
    
@Override
public boolean onKeyDown(int keyCode, KeyEvent keyEvent){
    switch (keyCode){
    case KeyEvent.KEYCODE_ALT_LEFT:
    case KeyEvent.KEYCODE_CTRL_LEFT:
    case KeyEvent.KEYCODE_META_LEFT:
                pair[0] = keyCode;
                return true;
                
    case KeyEvent.KEYCODE_SHIFT_LEFT:
                if (pair[0] == KeyEvent.KEYCODE_CTRL_LEFT){         //"ctrl+shift"          InputMethodManager inputMethodManager = (InputMethodManager) getApplicationContext().getSystemService(getApplicationContext().INPUT_METHOD_SERVICE);
                    inputMethodManager.showInputMethodPicker();         }
                if (pair[0] == KeyEvent.KEYCODE_ALT_LEFT){          // alt+shift            // switch lang
                    Locale locale1 = new Locale("en", "US");
                    Locale locale2 = new Locale("ru", "RU");

                    Locale l1 = Locale.getDefault();

                    Log.d(TAG, "" + l1.toString().equals(locale2.toString()));

                    if (l1.toString().equals(locale2.toString())){
                        l1.setDefault(locale1);
                    }
                    if (l1.toString().equals(locale1.toString())){
                        l1.setDefault(locale2);
                    }
                    
                    Toast.makeText(getApplicationContext(), l1.getDisplayLanguage(), Toast.LENGTH_SHORT).show();
                    
                    return true;
                }
                return true;
                
            default:
return super.onKeyDown(keyCode, keyEvent);
}
}

@Override 
public boolean onKeyUp(int keyCode, KeyEvent event){
    switch (keyCode)
    {
case KeyEvent.KEYCODE_ALT_LEFT:
case KeyEvent.KEYCODE_CTRL_LEFT:
case KeyEvent.KEYCODE_META_LEFT:
                pair[0] = 0;
                return true;

            default:
                return super.onKeyUp(keyCode, event);
}
}
}

Пробовал решения, найденные на этом форуме:

      //1
                try{
                    String keyCommand = "input keyevent " + KeyEvent.KEYCODE_LANGUAGE_SWITCH;
                    Runtime runtime = Runtime.getRuntime();
                    Process proc = runtime.exec(keyCommand);
                }
                catch (IOException e){
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

//2

new KeyEvent(KeyEvent.ACTION_DOWN, 
KeyEvent.KEYCODE_LANGUAGE_SWITCH);

//3
                InputConnection inputConnection = this.getCurrentInputConnection();
                if (inputConnection != null) {
                    inputConnection.sendKeyEvent(new KeyEvent(
                    keyEvent.getDownTime(), 
                    keyEvent.getEventTime(), 
                    keyEvent.getAction(), 
                    KeyEvent.KEYCODE_LANGUAGE_SWITCH,               keyEvent.getRepeatCount(),              0,              keyEvent.getDeviceId(),             keyEvent.getScanCode(),         keyEvent.getFlags()
                    ));}

//4
                Locale locale = new Locale("ru");
                Locale.setDefault(locale);
                Configuration config = getBaseContext().getResources().getConfiguration();
                config.locale = locale;
                getBaseContext().getResources().updateConfiguration(
                config,getBaseContext().getResources().getDisplayMetrics());

//5
Locale locale1 = new Locale("en", "US");
Locale locale2 = new Locale("ru", "RU");

Locale l1 = Locale.getDefault();

if (l1.toString().equals(locale2.toString())){
        l1.setDefault(locale1);
Resources resources = getResources();
Configuration configuration = resources.getConfiguration();
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){   configuration.setLocale(locale1);
}else{
            configuration.locale = locale1;}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N){
            getApplicationContext().createConfigurationContext(configuration);}else{    resources.updateConfiguration(configuration, displayMetrics);}
}
if (l1.toString().equals(locale1.toString())){
        l1.setDefault(locale2);
Resources resources = getResources();
Configuration configuration = resources.getConfiguration();
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
            configuration.setLocale(locale2);}else{

configuration.locale = locale2;}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N){
getApplicationContext().createConfigurationContext(configuration);}else{
    resources.updateConfiguration(configuration, displayMetrics);
}
}

Log.d(TAG, l1.getDisplayLanguage().toString());
Log.d(TAG, l1.toString());
    Toast.makeText(getApplicationContext(), "current lang= " + l1.getDisplayLanguage().toString(), Toast.LENGTH_SHORT).show();

Надеюсь на вашу помощь.

0 ответов

Другие вопросы по тегам