大佬教程收集整理的这篇文章主要介绍了android – 如何从3G和2G / EDGE切换反之亦然?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
>需要根
> Hackish并且可能特定于ROM(在CM 12.1 titan上测试)
>可能不适用于所有Android版本(在5.1.1上测试)
大部分代码都是从this answer by ChuongPham借来的.
首先,我们需要通过获取ITelephony类的声明字段的值来获取正确的事务代码.由于我怀疑字段的名称可能会略有不同,具体取决于平台(对于我的字段名称是“transaCTION_setPreferredNetworkType_96”),我提供了尽可能灵活的解决方案:
private static String get3gtransactionCode(Context context) throws ClassnotFoundException,NoSuchMethodException,InvocationTargetException,illegalaccessexception,NoSuchFieldException { final Telephonymanager mTelephonymanager = (Telephonymanager) context.getSystemservice(Context.TELEPHONY_serviCE); final Class<?> mTelephonyClass = Class.forName(mTelephonymanager.getClass().getName()); final Method mTelephonymethod = mTelephonyClass.getDeclaredMethod("getITelephony"); mTelephonymethod.setAccessible(true); final Object mTelephonystub = mTelephonymethod.invoke(mTelephonymanager); final Class<?> mTelephonystubClass = Class.forName(mTelephonystub.getClass().getName()); final Class<?> mClass = mTelephonystubClass.getDeclaringClass(); for (Field f:mClass.getDeclaredFields()) { if (f.getName().contains("setPreferredNetworkType")) { final Field field = mClass.getDeclaredField(f.getName()); field.setAccessible(true); return String.valueOf(field.geTint(null)); } } throw new NoSuchFieldException(); }
private static void setPreferredNetworkType(Context context,int preferredTypE) throws ClassnotFoundException,NoSuchFieldException,InvocationTargetException { String transactionCode = get3gtransactionCode(context); String command = "service call phone " + transactionCode + " i32 " + preferredType; executeCommandViaSu(context,"-c",command); }
在我的情况下,我将该方法称为2G的第二个参数为1,3G首选项为10.不同网络类型的常量可以在here找到.
为了方便和完整,我还从ChuongPham’s answer复制粘贴executeCommandViaSu方法:
private static void executeCommandViaSu(Context context,String option,String command) { Boolean success = false; String su = "su"; for (int i=0; i < 3; i++) { // Default "su" command executed successfully,then quit. if (success) { break; } // Else,execute other "su" commands. if (i == 1) { su = "/system/xbin/su"; } else if (i == 2) { su = "/system/bin/su"; } try { // Execute command as "su". Runtime.getRuntime().exec(new String[]{su,option,commanD}); } catch (IOException E) { success = false; // Oops! CAnnot execute `su` for some reason. // Log error here. } finally { success = true; } } }
以上是大佬教程为你收集整理的android – 如何从3G和2G / EDGE切换反之亦然?全部内容,希望文章能够帮你解决android – 如何从3G和2G / EDGE切换反之亦然?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。