У меня есть приложение с полупрозрачной активностью, уничтоженное с помощью 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
com.android.server
, который невидим для приложений. Что делает код 39? Возможно, есть способ сделать это через API. - person TheWanderer   schedule 09.01.2019service call
, но здесь я спрашиваю о том, как получить только код для команды execcall service connectivity
, а также не отвечаю на мой вопрос, так как я сказалprogrammatically
(фактический код), а не bash, который я не знаю, как запустить для новичка, такого как я. В SO я где-то раньше натыкаюсь на ответ, за который сильно проголосовали, потому что он связан с блогом или временными источниками, подобными этому ответу в вопросе, который, как вы сказали, я продублировал. . Ответы должны быть в контексте того же поста или из проверенных источников. - person Beyondo   schedule 09.01.2019AUT - Auto USB Tether
, которое действительно нужно мне, и оно работает! Он использует root так же, как и я, и я просто попытался его декомпилировать, чтобы увидеть, как он получаетservice code
. Но я терплю неудачу, так как большинство имен функций/переменных зашифрованы и их трудно понять - person Beyondo   schedule 09.01.2019Log.e
/Toast
. Да, выдает исключение... Сейчас выложу код.. - person Beyondo   schedule 10.01.2019W/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.2019ACCESS_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.2019Settings.System.canWrite(this)
, и проверил активностьACTION_MANAGE_WRITE_SETTINGS
. - person Beyondo   schedule 10.01.201940
. - person Beyondo   schedule 10.01.2019setUsbTetherMode(boolean enabled)
. Затем вы захотите использовать это в своей реализации метода AIDL внутри корневого класса. - person TheWanderer   schedule 10.01.2019