Android: как заново включить службу доступности после каждой перезагрузки? - PullRequest
0 голосов
/ 03 июня 2019

Устройство, о котором мы говорим, - это головное устройство Android 8 с подключенной внешней клавиатурой USB.Что ж, мне нужно назначить некоторые функции для функциональных клавиш этой клавиатуры, например, запуск определенных приложений.Скажем, F4 может запустить медиаплеер, F5 приложение для навигации и так далее.Для этой цели подойдет плагин Automate или AutoInput Tasker, но все приложения такого типа используют службу специальных возможностей для взаимодействия с физическими устройствами HID.

Большая проблема здесь в том, что это конкретное устройство Android регулярно убивает службы специальных возможностей при (горячей) перезагрузке.Перепробовал абсолютно все, от отключения режима энергосбережения до пометки Automate и т. Д. Как приложение администратора устройства, ничего не помогло.Поэтому я подал в отставку, и теперь я подумываю об альтернативном способе повторного включения соответствующей службы специальных возможностей после того, как система отключила ее после перезагрузки по неизвестной причине.

Если устройство было рутировано, я предполагаю, что оно будетпростой способ перезапустить службу специальных возможностей с помощью команды оболочки или чего-либо еще (только догадка, я довольно новичок в Android).Но, очевидно, я хочу избежать рутирования, если это возможно.Идеальным сценарием было бы (авто) запускать команду оболочки / приложение / службу переднего плана / что угодно при каждой перезагрузке - при этом было бы достаточно административных привилегий для повторного включения службы специальных возможностей, которую система только что отключила во время перезагрузки.Конечно, все это мелочи без рута устройства.Но я не совсем уверен, что это можно сделать на Android (на Windows было бы достаточно службы, работающей в системной учетной записи, но Android - это отдельная история).

Справедливым решением может быть

  1. root устройство,
  2. установка команды оболочки (приложение, служба переднего плана и т. Д.), Предназначенной для перезапуска службы специальных возможностей после каждой перезагрузки, и
  3. отключение устройства (с помощью SuperSU (пример), чтобы защитить пользователя и не аннулировать гарантию.

Кто-нибудь скажет мне, может ли вышеуказанное решение дать желаемый результат, и - если так -Могу ли я дать некоторые рекомендации, как это сделать?

1 Ответ

1 голос
/ 03 июня 2019

для достижения вашей цели вы должны работать с BroadcastReceiver и jobIntentService

сначала создайте загрузочный приемник

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            MyService.enqueueWork(context, new Intent());
        }
    }

}

добавить к manifest

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<receiver android:name=".BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
</receiver>

<service android:name=".MyService"
         android:permission="android.permission.BIND_JOB_SERVICE"/>

Теперь вы должны определить ваш jobIntent

public class MyService extends JobIntentService {

    public static final int JOB_ID = 0x01;

    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, MyService.class, JOB_ID, work);
    }

    @Override
    protected void onHandleWork(@NonNull Intent intent) {
        // your code
    }

}

И это все. Это непосредственно запустит службу (при работе на платформах до O) или поставит работу для нее как задание (при работе на O и более поздних версиях). Независимо от платформы, все, что вы передадите в enqueueWork, в конечном итоге появится в onHandleWork.

вот несколько полезных ссылок: ссылка - ссылка

...