Я нашел некоторые интересные методы в классе telephonyManager, такие как включение / выключение мобильных данных, но при попытке их использовать, очевидно, выдает исключение безопасности («Нет привилегий оператора связи»). Я погуглил, но не нашел полезного решения.
Поскольку это привилегия оператора связи, я подумал, что можно получить ее разрешение с помощью telephonyManager.getIccAuthentication(int appType, int authType, String data), но у меня проблемы с входными параметрами, потому что я не могу понять, что мне передать, чтобы заставить его работать.
Из документации к первому параметру будет передаваться TelephonyManager.APPTYPE_SIM или / и TelephonyManager.APPTYPE_USIM, в зависимости от того, имеет ли он большое значение при использовании setDataEnabled(boolean).
Если бы я передал TelephonyManager.APPTYPE_SIM в качестве первого аргумента, думаю, мне бы следовало передать TelephonyManager.AUTHTYPE_EAP_SIM в качестве второго аргумента (поправьте меня, если я ошибаюсь), и наоборот, когда TelephonyManager.APPTYPE_USIM в качестве первого, а TelephonyManager.AUTHTYPE_EAP_AKA - в качестве второго.
И третий аргумент. Должна быть закодирована Base64 в строку. Я нашел в TelephonyProvider эту строку кода:
String base64Challenge = Base64.encodeToString(byteParam, Base64.NO_WRAP);, где byteParam - это входной байт из другого метода, которому предшествуют тысячи других методов. Если я передаю "" в качестве третьего параметра методу getIccAuthentication, я снова получаю securityException (это, очевидно, неправильный параметр), но это вызывает у меня отсутствие getIccSimChallengeResponse. Боюсь, что это может быть бесконечный цикл методов, но, может быть, у кого-то есть идея или поможет мне разобраться в этом?
Мой пример кода:
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.buttonPanel);
button.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onClick(View view) {
try {
Process p = Runtime.getRuntime().exec("su");
tel();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void tel(){
// String base64Challenge = Base64.encodeToString(,
Base64.NO_WRAP);
TelephonyManager telephonyManager = (TelephonyManager)
getSystemService(Context.TELEPHONY_SERVICE);
boolean isCarrier = telephonyManager.hasCarrierPrivileges();
String authentication =
telephonyManager.getIccAuthentication(TelephonyManager.APPTYPE_SIM,
TelephonyManager.AUTHTYPE_EAP_SIM, "");
Log.v(TAG, authentication);
if (isCarrier) {
Log.v(TAG, "privs granted");
telephonyManager.setDataEnabled(false);
} else {
Log.v(TAG, "no privilegies");
}
}
}




Из документов:
Requires Permission: READ_PRIVILEGED_PHONE_STATE or that the calling app has carrier privileges (see hasCarrierPrivileges()).
Первый из них требует, чтобы вы были установлены как привилегированное системное приложение (требуется root-доступ или собственный системный сертификат). Второй требует, чтобы ваш UID был оператором связи. Без этого никакая комбинация параметров работать не будет.
Хорошо, у меня есть рутированное устройство, и я запрашиваю права суперпользователя, просто выполнив команду «su». Но что дальше?
Приложению не нужен root, его необходимо установить в системный каталог Privlidged apps (удалите его, adb переместите apk в нужное место, перезагрузите устройство). Затем он может вызывать эту функцию, пока запрашивается разрешение READ_PRIVLIDGED_PHONE_STATE. Однако этого, вероятно, будет недостаточно, поскольку похоже, что третий параметр - это пароль base64, который проверяется физической SIM-картой в устройстве.
Хорошо, спасибо за объяснение. Так что все, что мне нужно, это сгенерированный пароль base64, проверенный сим-картой, да? Этот пароль постоянный или генерируется по-разному для каждого устройства?
Не уверен. Я предполагаю, что это будет связано с конкретным устройством или учетной записью телекоммуникационной сети, и SIM-карта проверяет это с данными, которые она загружает при настройке. Константу слишком легко взломать
Пожалуйста, добавьте несколько блоков кода.