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

У меня есть приложение с полупрозрачной активностью, уничтоженное с помощью finish() после запуска службы, которая работает в фоновом режиме и прослушивает действие USB_STATE, а затем выполняет эту команду: service call connectivity CODE i32 1 при подключении. очень простой.

Это для включения USB-модема (конечно, используя root). Но настоящая проблема заключается в CODE, поскольку она отличается от SDK к другому. например, если я наберу service call connectivity 39 i32 1, он только будет работать на Samsung Nougat.

Итак, я подумал о двух разных способах преодоления этого

  • 1-й: создание оператора switch case, который переключает Build.VERSION.SDK_INT и, в соответствии с оцененным случаем, устанавливает код службы из списка, который я взял из этот ответ...

Ошибка: в этом списке отсутствует много старых и новых сервисных кодов.

Даже если они у меня есть полностью! (имеются в виду все случаи SDK_INT и услуги CODEs). Тогда как насчет поступающих новых версий Android? Кто хочет обновлять такое простое приложение каждый выпуск Android!

  • 2-й: очень плохой способ, например, перебирать i от 30 до 100, заменяя CODE в приведенной выше команде и выполняя то, что работает, ну... просто работает.

Ошибка: неправильный стиль кодирования, потребляет больше энергии, и приложение может перестать отвечать на запросы, если его часто запускать.

Мне просто нужно, чтобы мое приложение динамически && программно получало service CODE, и как?

EDIT: я пытался использовать отражение, но оно тоже не работает.

try {
// Also tried setUsbTethering
// and ConnectivityManager.setUsbTethering
            Method method = this.getClass().getMethod("IConnectivityManager.setUsbTethering", Integer.class);
            method.invoke(null, true);
            Toast.makeText(this, "turned on", Toast.LENGTH_LONG).show();
        }catch (Exception e)
        {
            Log.e("AUTO TETHERING", e.getMessage(), e);
        }

Но я получаю NoSuchMethodException


person Beyondo    schedule 09.01.2019    source источник
comment
Вы не можете. Константы являются частью пути к классам com.android.server, который невидим для приложений. Что делает код 39? Возможно, есть способ сделать это через API.   -  person TheWanderer    schedule 09.01.2019
comment
@TheWanderer Хорошо, спасибо за информацию, но поверьте мне, для меня не сработало ничего, кроме как для суперпользователя.   -  person Beyondo    schedule 09.01.2019
comment
Можете ли вы просто сказать, что это такое, пожалуйста?   -  person TheWanderer    schedule 09.01.2019
comment
@TheWanderer Что сказать? в посте все очень подробно описано. Просто приложение, которое автоматически привязывает USB при подключении.   -  person Beyondo    schedule 09.01.2019
comment
Извините, я пропустил эту часть. Одна минута.   -  person TheWanderer    schedule 09.01.2019
comment
@AlexP Я не думаю, что это дубликат. У OP, похоже, проблема с XY.   -  person TheWanderer    schedule 09.01.2019
comment
@TheWanderer, у ОП довольно много проблем, но та, которую он решил указать в заголовке, - это именно та, на которую ответили в дублирующемся посте.   -  person Alex P.    schedule 09.01.2019
comment
@АлексП. Но это не настоящий вопрос.   -  person TheWanderer    schedule 09.01.2019
comment
@TheWanderer На самом деле нет. Упомянутый пост ищет документацию для service call, но здесь я спрашиваю о том, как получить только код для команды exec call service connectivity, а также не отвечаю на мой вопрос, так как я сказал programmatically (фактический код), а не bash, который я не знаю, как запустить для новичка, такого как я. В SO я где-то раньше натыкаюсь на ответ, за который сильно проголосовали, потому что он связан с блогом или временными источниками, подобными этому ответу в вопросе, который, как вы сказали, я продублировал. . Ответы должны быть в контексте того же поста или из проверенных источников.   -  person Beyondo    schedule 09.01.2019
comment
@XStylish Я думаю, ты хотел пропинговать Алекса. Я проголосовал за то, чтобы снова открыть ваш вопрос, но тем временем вы взглянули на эту ссылку? Я думаю, что он делает то, что вы хотите, и вам даже не нужен root для этого.   -  person TheWanderer    schedule 09.01.2019
comment
@TheWanderer Упс... Да, я пробовал это с помощью отражения, но, к сожалению, это не работает... Я также пробовал много приложений в магазине игр, ни одно из них не работает, и для большинства из них требуется, чтобы устройства были установлен на ПК, но я не хочу этого. Итак, есть только одно приложение с именем AUT - Auto USB Tether, которое действительно нужно мне, и оно работает! Он использует root так же, как и я, и я просто попытался его декомпилировать, чтобы увидеть, как он получает service code. Но я терплю неудачу, так как большинство имен функций/переменных зашифрованы и их трудно понять   -  person Beyondo    schedule 09.01.2019
comment
@АлексП. Извините, но, пожалуйста, снова откройте вопрос, чтобы, как только я найду ответ ... по крайней мере, я мог опубликовать его здесь.   -  person Beyondo    schedule 09.01.2019
comment
@XStylish что значит не работает? Выдает ли это исключение?   -  person TheWanderer    schedule 09.01.2019
comment
@TheWanderer Нет .. Я имел в виду, что это ничего не меняет или статус usb_tethering   -  person Beyondo    schedule 09.01.2019
comment
Можете ли вы отредактировать то, что у вас есть в вашем вопросе?   -  person TheWanderer    schedule 10.01.2019
comment
@TheWanderer Извините .. после повторного перекодирования я заметил, что поймал исключение, но ничего не сделал Log.e/Toast. Да, выдает исключение... Сейчас выложу код..   -  person Beyondo    schedule 10.01.2019
comment
Хорошо, ваше отражение совершенно неверно. Попробуйте это. Помните, что вам нужно, чтобы WRITE_SETTINGS были предоставлены вашему приложению, чтобы это работало. stackoverflow.com/questions/32083410/   -  person TheWanderer    schedule 10.01.2019
comment
Извините, если первое предложение звучит грубо. Этого не должно было быть.   -  person TheWanderer    schedule 10.01.2019
comment
@TheWanderer Нет, это правда, потому что я заявил, что я новичок в комментарии выше. Я не ответил вовремя, потому что попробовал ваш код, и он больше не выдает то же исключение, но теперь у меня есть совершенно другая проблема, поэтому я пытался решить ее, как мог, а затем я собирался рассказать вам, что я сделал до сих пор, чтобы решить ее, если у меня не получится ... не потому, что я злюсь или что-то в этом роде. Кстати, вот что произошло... во-первых, я получил исключение: W/System.err: Caused by: java.lang.SecurityException: ConnectivityService: Neither user 10253 nor current process has android.permission.ACCESS_NETWORK_STATE.   -  person Beyondo    schedule 10.01.2019
comment
Вы предоставили доступ к WRITE_SETTINGS?   -  person TheWanderer    schedule 10.01.2019
comment
Итак, я предоставил ACCESS_NETWORK_STATE, но затем выдал W/System.err: Caused by: java.lang.SecurityException: You either need MANAGE_USERS or CREATE_USERS permission to: query user.   -  person Beyondo    schedule 10.01.2019
comment
@TheWanderer Да, я сделал это и убедился, что использовал Settings.System.canWrite(this), и проверил активность ACTION_MANAGE_WRITE_SETTINGS.   -  person Beyondo    schedule 10.01.2019
comment
Какое у вас тестовое устройство и ОС?   -  person TheWanderer    schedule 10.01.2019
comment
@ TheWanderer SM-G610F, J7 Prime, версия Android: 7.0 (последнее обновление не установлено с тех пор, как я получил root-права), а его служебный код — 40.   -  person Beyondo    schedule 10.01.2019
comment
Хорошо, я думаю, вам нужно будет использовать root. Внедрите libRootJava в свой проект и следуйте инструкциям по созданию и запуску корневого класса, а также созданию IPC Binder. . Вам нужно назвать метод AIDL, например, setUsbTetherMode(boolean enabled). Затем вы захотите использовать это в своей реализации метода AIDL внутри корневого класса.   -  person TheWanderer    schedule 10.01.2019