百度Utility 网络判断:
package com.baidu.speech.utils; import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Build; import android.os.Build.VERSION; import android.text.TextUtils; import android.util.Log; import com.mstar.android.ethernet.EthernetManager; import java.io.BufferedReader; import java.io.FileReader; import java.io.InputStream; import java.io.Reader; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Locale; public final class Utility { private static final int THOUSAND_DIV = 1000; private static final int BYTES_PER_SAMPLE_8BIT = 1; private static final int BYTES_PER_SAMPLE_16BIT = 2; private static final int BYTES_PER_SHORT = 2; private static int maxCpuFreq = 0; private static int EVR_NETWORK_TYPE_NO = 0; private static int EVR_NETWORK_TYPE_2G = 1; private static int EVR_NETWORK_TYPE_3G = 2; private static int EVR_NETWORK_TYPE_4G = 3; private static int EVR_NETWORK_TYPE_WIFI = 4; private static final String TAG = "Utility"; private static ConnectivityManager mConnManager = null; static void init(Context paramContext) { if (paramContext != null) { mConnManager = (ConnectivityManager)paramContext.getSystemService("connectivity"); } } public static int getVoiceDataSizeInShort(int paramInt1, int paramInt2, int paramInt3) { if ((paramInt3 != 2) && (paramInt3 != 3)) { throw new IllegalArgumentException("audio format invalid"); } int i; if (paramInt3 == 3) { i = 1; } else { i = 2; } int j = paramInt1 * paramInt2 * i / 1000; int k = j / 2; return k; } static String generatePlatformString() { StringBuilder localStringBuilder = new StringBuilder("Android"); localStringBuilder.append('&'); try { localStringBuilder.append(URLEncoder.encode(Build.MODEL, "utf-8")); localStringBuilder.append('&'); localStringBuilder.append(URLEncoder.encode(VERSION.RELEASE, "utf-8")); } catch (UnsupportedEncodingException localUnsupportedEncodingException) { localUnsupportedEncodingException.printStackTrace(); } localStringBuilder.append('&'); localStringBuilder.append(VERSION.SDK_INT); String str = localStringBuilder.toString(); return str; } static int getStatusType(int paramInt) { return paramInt & 0xFFFF0000; } private static boolean isRunningEmulator() { return (Build.MODEL.equals("sdk")) || (Build.MODEL.equals("google_sdk")); } public static int getMaxCpuFreq() { try { String str = ""; if (0 != maxCpuFreq) { return maxCpuFreq; } Object localObject2; Object localObject1; Object localObject3; if (isRunningEmulator()) { localObject2 = new String[] { "/system/bin/cat", "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq" }; localObject1 = new ProcessBuilder((String[])localObject2); localObject3 = ((ProcessBuilder)localObject1).start(); InputStream localInputStream = ((Process)localObject3).getInputStream(); byte[] arrayOfByte = new byte[24]; while (localInputStream.read(arrayOfByte) != -1) { str = str + new String(arrayOfByte); } localInputStream.close(); ((Process)localObject3).destroy(); } else { localObject1 = null; localObject2 = null; localObject3 = "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq"; localObject1 = new FileReader((String)localObject3); localObject2 = new BufferedReader((Reader)localObject1); str = ((BufferedReader)localObject2).readLine(); ((BufferedReader)localObject2).close(); ((FileReader)localObject1).close(); } int i = getCpuInfo(); if (TextUtils.isEmpty(str)) { return i; } str = str.trim(); int j = Integer.parseInt(str); maxCpuFreq = j >= i ? j : i; return maxCpuFreq; } catch (Exception localException) {} return 0; } private static int getCpuInfo() { try { String str1 = "/proc/cpuinfo"; String str2 = ""; String str3 = ""; FileReader localFileReader = new FileReader(str1); BufferedReader localBufferedReader = new BufferedReader(localFileReader, 1024); while ((str2 = localBufferedReader.readLine()) != null) { if (str2.indexOf("BogoMIPS") != -1) { String[] arrayOfString = str2.split("\\s+"); str3 = arrayOfString[2]; } } localBufferedReader.close(); str3 = str3.trim(); return (int)(Float.parseFloat(str3) * 1000.0F); } catch (Exception localException) {} return 0; } @SuppressLint({"DefaultLocale"}) static boolean isUsingWifi() { boolean bool = false; if (mConnManager != null) { NetworkInfo localNetworkInfo = mConnManager.getActiveNetworkInfo(); if (localNetworkInfo != null) { bool = "wifi".equals(localNetworkInfo.getTypeName().toLowerCase()); } } return bool; } public static boolean is2G(Context paramContext) { try { String str = ""; ConnectivityManager localConnectivityManager = (ConnectivityManager)paramContext.getApplicationContext().getSystemService("connectivity"); if (!isNetworkPerission(paramContext)) { return false; } NetworkInfo localNetworkInfo = localConnectivityManager.getActiveNetworkInfo(); if ((localNetworkInfo != null) && (localNetworkInfo.isConnectedOrConnecting())) { str = localNetworkInfo.getTypeName().toLowerCase(); if (str.equals("wifi")) { return false; } int i = localNetworkInfo.getSubtype(); switch (i) { case 1: case 2: case 4: case 7: case 11: case 16: return true; } } } catch (Exception localException) { localException.printStackTrace(); } return false; } private static boolean isNetworkPerission(Context paramContext) { try { boolean bool = 0 == paramContext.getPackageManager().checkPermission("android.permission.ACCESS_NETWORK_STATE", paramContext.getPackageName()); return bool; } catch (Exception localException) { localException.printStackTrace(); } return false; } static boolean isUsingWifi(Context paramContext) { try { ConnectivityManager localConnectivityManager = (ConnectivityManager)paramContext.getApplicationContext().getSystemService("connectivity"); if (!isNetworkPerission(paramContext)) { return false; } NetworkInfo localNetworkInfo = localConnectivityManager.getActiveNetworkInfo(); if ((localNetworkInfo != null) && ("wifi".equals(localNetworkInfo.getTypeName().toLowerCase(Locale.US)))) { return true; } } catch (Exception localException) { localException.printStackTrace(); } return false; } @SuppressLint({"DefaultLocale"}) public static int getWifiOr2gOr3G(Context paramContext) { int i = EVR_NETWORK_TYPE_NO; try { if (paramContext != null) { ConnectivityManager localConnectivityManager = (ConnectivityManager)paramContext.getApplicationContext().getSystemService("connectivity"); if (!isNetworkPerission(paramContext)) { return i; } NetworkInfo localNetworkInfo = localConnectivityManager.getActiveNetworkInfo(); if ((localNetworkInfo != null) && (localNetworkInfo.isConnectedOrConnecting())) { String str = localNetworkInfo.getTypeName().toLowerCase(); if (str.equals("wifi")) { i = EVR_NETWORK_TYPE_WIFI; } else { i = EVR_NETWORK_TYPE_2G; int j = localNetworkInfo.getSubtype(); switch (j) { case 7: i = EVR_NETWORK_TYPE_3G; break; case 4: break; case 2: break; case 5: i = EVR_NETWORK_TYPE_3G; break; case 6: i = EVR_NETWORK_TYPE_3G; break; case 1: break; case 8: i = EVR_NETWORK_TYPE_3G; break; case 10: i = EVR_NETWORK_TYPE_3G; break; case 9: i = EVR_NETWORK_TYPE_3G; break; case 3: i = EVR_NETWORK_TYPE_3G; break; case 14: i = EVR_NETWORK_TYPE_3G; break; case 12: i = EVR_NETWORK_TYPE_3G; break; case 15: i = EVR_NETWORK_TYPE_3G; break; case 11: break; case 13: i = EVR_NETWORK_TYPE_4G; } } }else{ EthernetManager ethernetManager = EthernetManager.getInstance(); boolean ethConn = ethernetManager.isNetworkConnected(); if(ethConn){ i = EVR_NETWORK_TYPE_2G; } Log.i("MainActivityConnect","ethConn: " + ethConn); } } } catch (Exception localException) { localException.printStackTrace(); } return i; } public static String urlEncode(String paramString1, String paramString2) { try { if (!TextUtils.isEmpty(paramString1)) { paramString1 = URLEncoder.encode(paramString1, paramString2); } } catch (UnsupportedEncodingException localUnsupportedEncodingException) {} return paramString1; } public static boolean checkPermission(Context paramContext, String paramString) { int i = paramContext.checkCallingOrSelfPermission(paramString); return i == 0; } public static NetworkInfo getNetworkInfo(Context paramContext) { ConnectivityManager localConnectivityManager = (ConnectivityManager)paramContext.getSystemService("connectivity"); return localConnectivityManager.getActiveNetworkInfo(); } public static boolean isNetworkConnected(Context paramContext) { NetworkInfo localNetworkInfo = getNetworkInfo(paramContext); return (localNetworkInfo != null) && (localNetworkInfo.isConnected()); } public static boolean isWifiConnected(Context paramContext) { NetworkInfo localNetworkInfo = getNetworkInfo(paramContext); return (localNetworkInfo != null) && (localNetworkInfo.isConnected()) && (localNetworkInfo.getType() == 1); } public static String getLineNumber(Exception paramException) { StackTraceElement[] arrayOfStackTraceElement = paramException.getStackTrace(); if ((arrayOfStackTraceElement == null) || (arrayOfStackTraceElement.length == 0)) { return null; } return arrayOfStackTraceElement[0].getFileName() + ":" + arrayOfStackTraceElement[0].getLineNumber(); } public static String getFileName(Exception paramException) { StackTraceElement[] arrayOfStackTraceElement = paramException.getStackTrace(); if ((arrayOfStackTraceElement == null) || (arrayOfStackTraceElement.length == 0)) { return null; } return arrayOfStackTraceElement[0].getFileName(); } public static String fun(Exception paramException) { StackTraceElement[] arrayOfStackTraceElement = paramException.getStackTrace(); if (arrayOfStackTraceElement == null) { return ""; } return arrayOfStackTraceElement[0].getMethodName() + "()"; } } /* Location: D:\软件区\androidkiller\AndroidKiller_v1.3.1\bdasr_V3_20171108_9800a2a.jar * Qualified Name: com.baidu.speech.utils.Utility * JD-Core Version: 0.7.0.1 */
转载的获取subtype类型值问题:
很多时候需要先判断当前用户的网络,才会继续之后的一些处理逻辑。但网络类型获取这一块,我用我自己的的手机调试时遇到一些问题,这里记录一下。
一加手机一代,移动4G 网络,得到的subtype类型值为17,我查过Android 5.1的源码,它最大的值也就为16。(点击这里在线查看源码>>)
我拿魅族的移动4G测试的结果如下:
小米4,电信4G的测试结果如下:
魅族MX4,联通3G
还测试了其它华为移动3G/4G的情况,就我自己的手机一加返回的值有点奇怪,之后我查了一下它的参数:http://detail.zol.com.cn/374/373908/param.shtml
当然,其它厂商:华为、小米、魅族与上面显示的网络类型基本上是一致的。都是3G:TD-SCDMA、WCDMA等
而目前测试的情况就是仅一加返回的值为17,这会导致正常的判断出现问题,无法识别到底使用的是何种网络。而我通过logcat的日志,却很清晰的发现系统自己是能识别的
最后我根据网络上提供的资料,加了一项比较特殊的判断,演变成如下的代码:
public static String GetNetworkType()
{
String strNetworkType = "";
NetworkInfo networkInfo = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE).getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected())
{
if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI)
{
strNetworkType = "WIFI";
}
else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
{
String _strSubTypeName = networkInfo.getSubtypeName();
Log.e("cocos2d-x", "Network getSubtypeName : " + _strSubTypeName);
// TD-SCDMA networkType is 17
int networkType = networkInfo.getSubtype();
switch (networkType) {
case TelephonyManager.NETWORK_TYPE_GPRS:
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_CDMA:
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_IDEN: //api<8 : replace by 11
strNetworkType = "2G";
break;
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_EVDO_A:
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_EVDO_B: //api<9 : replace by 14
case TelephonyManager.NETWORK_TYPE_EHRPD: //api<11 : replace by 12
case TelephonyManager.NETWORK_TYPE_HSPAP: //api<13 : replace by 15
strNetworkType = "3G";
break;
case TelephonyManager.NETWORK_TYPE_LTE: //api<11 : replace by 13
strNetworkType = "4G";
break;
default:
// http://baike.baidu.com/item/TD-SCDMA 中国移动 联通 电信 三种3G制式
if (_strSubTypeName.equalsIgnoreCase("TD-SCDMA") || _strSubTypeName.equalsIgnoreCase("WCDMA") || _strSubTypeName.equalsIgnoreCase("CDMA2000"))
{
strNetworkType = "3G";
}
else
{
strNetworkType = _strSubTypeName;
}
break;
}
Log.e("cocos2d-x", "Network getSubtype : " + Integer.valueOf(networkType).toString());
}
}
Log.e("cocos2d-x", "Network Type : " + strNetworkType);
return strNetworkType;
}
希望对需要的人有所帮助吧。我在网上搜索到,之前其实有人提出过类似的疑问,但是没有答案:
telephony.getNetworkType() 这个方法为什么在有些手机里面获取的值API没有呢,例如16、17。这两个在 TelephonyManager这个API里面就没有
参考链接:
How to determine if network type is 2G, 3G or 4G