Android: как повторно включить службу специальных возможностей после каждой перезагрузки?

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

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

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

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

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

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


person Zoltán Bíró    schedule 02.06.2019    source источник


Ответы (1)


для достижения вашей цели вы должны работать с 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.

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

person ismail alaoui    schedule 02.06.2019
comment
Спасибо. Как я уже говорил, я новичок в Android, и у меня следующий вопрос: приложение-владелец этого манифеста должно быть сервисом переднего плана или это может быть обычное приложение? Если да, должен ли я рутировать устройство или приложение, которое может запускать службу, может получить достаточно привилегий для этого? - person Zoltán Bíró; 03.06.2019
comment
манифест приложения, и вам не нужно рутировать устройство - person ismail alaoui; 03.06.2019
comment
пожалуйста, рассмотрите мой ответ, если он был правильным или полезным, это важно для сообщества SO - person ismail alaoui; 04.06.2019