Android 5+, как изменить предпочитаемую сеть
Привет, я много читал об этом аргументе, но я думаю, что есть много ошибок в том, как можно изменить предпочтительную сеть в Android 5+.
Прежде всего, мое приложение может использовать root, но в качестве обязательного условия оно должно оставаться в игровом магазине.
Для этого я думаю, что есть три метода:
- с корнем
- подписать ваше приложение с сертификатом системного приложения
- подписать ваше приложение с разрешения оператора
Для второго метода есть несколько больших проблем:
- Вы не можете опубликовать в игровом магазине ваше приложение, подписанное с сертификатом системы
- Приложение с системным сертификатом не может быть установлено на определенных устройствах (например, Huawei)
Для третьего способа проблема в том, что Vodafone не мои друзья:)
Итак, давайте поговорим о первом методе:
В игровом магазине есть много приложений, которые могут изменять предпочитаемую сеть с правами суперпользователя, например, Auotomate: https://play.google.com/store/apps/details?id=com.llamalab.automate.ext.superuser&hl=it
Я думаю, что все приложения вызывают с отражением в корневом сеансе эту функцию из внутреннего API: https://github.com/android/platform_frameworks_base/blob/nougat-mr1-release/telephony/java/com/android/internal/telephony/ITelephony.aidl#L753
Поэтому я должен попытаться сделать это с помощью этого кода... но заморозить мое приложение:
/**
* Function that change the preffered network
* @param Context context - The context of application
* @param String state_network - State that you want change ["2G" "3G" "4G" "2G/3G" "2G/3G/4G"]
* @return boolean
*/
public static String setDeviceNetwork(Context context, String state_network){
try {
Process process = null;
process = Runtime.getRuntime().exec("su");
process.waitFor();
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
try{
Class<?> forName = Class.forName("com.android.internal.telephony.PhoneFactory");
try {
Method getDefaultPhone = forName.getMethod("getDefaultPhone", new Class[]{});
getDefaultPhone.setAccessible(true);
try {
Object mPhone = getDefaultPhone.invoke(null, new Object[]{}); //@TODO qui!
Method setPreferredNetworkType = mPhone.getClass().getMethod("setPreferredNetworkType", new Class[]{int.class, Message.class});
Method getPreferredNetworkType = mPhone.getClass().getMethod("getPreferredNetworkType", new Class[]{Message.class});
setPreferredNetworkType.setAccessible(true);
setPreferredNetworkType.invoke(mPhone, new Object[]{1, "1"});
return "WORK!";
}catch (IllegalAccessException e){
return "Error IllegalAccessException on run command change network";
}catch (InvocationTargetException e){
return "Error InvocationTargetException on run command change network";
}
}catch (NoSuchMethodException e){
return "Error NoSuchMethodException on find method";
}
}catch (ClassNotFoundException e){
return "Error ClassNotFoundException on find class";
}
} catch (IOException e) {
e.printStackTrace();
return "Error IOException on sudo command";
}
catch (InterruptedException e) {
e.printStackTrace();
return "Error InterruptException on sudo command";
}
}
Любое решение по этой проблеме?