天天看點

擷取手機品牌機型 手機營運商 以及資料流量類型 是2G還是3G,4G 和 擷取手機目前網絡類型

        最近項目中遇到與日本的AWS伺服器進行資料互動 通路https協定, 自己用單例寫了一個相信任何網頁的httpclient去連接配接,成功後需要上傳大量的圖檔,但是測試機有限,老闆讓我寫一個測試程式給大量的使用者去測,由于客戶不知道什麼機型啊 網絡類型什麼的 就要求一個按鈕 擷取我們需要的測試結果。 開始在網上找如何擷取手機品牌機型 手機營運商 以及資料流量的類型的内容,發現魚龍混雜。自己花了點時間封裝了一下 以便以後用到的時候可以直接拷貝使用。

由于是擷取硬資訊是以有大量的常量去比對

代碼沒什麼複雜的很簡單就能看懂 就直接上代碼了

public class Utils {
	private static final int NETWORK_TYPE_UNAVAILABLE = -1;  
    private static final int NETWORK_TYPE_WIFI = -101;  
    private static final int NETWORK_CLASS_WIFI = -101;  
    private static final int NETWORK_CLASS_UNAVAILABLE = -1;  
    /** 不清楚資料流量類型 */  
    private static final int NETWORK_CLASS_UNKNOWN = 0;  
    /** 資料流量類型為2G */  
    private static final int NETWORK_CLASS_2_G = 1;  
    /**  資料流量類型為3G  */  
    private static final int NETWORK_CLASS_3_G = 2;  
    /**  資料流量類型為4G . */  
    private static final int NETWORK_CLASS_4_G = 3;  
    private static DecimalFormat df = new DecimalFormat("#.##");  
	// 适配低版本手機  
    /** Network type is unknown */  
    public static final int NETWORK_TYPE_UNKNOWN = 0;  
    /** Current network is GPRS */  
    public static final int NETWORK_TYPE_GPRS = 1;  
    /** Current network is EDGE */  
    public static final int NETWORK_TYPE_EDGE = 2;  
    /** Current network is UMTS */  
    public static final int NETWORK_TYPE_UMTS = 3;  
    /** Current network is CDMA: Either IS95A or IS95B */  
    public static final int NETWORK_TYPE_CDMA = 4;  
    /** Current network is EVDO revision 0 */  
    public static final int NETWORK_TYPE_EVDO_0 = 5;  
    /** Current network is EVDO revision A */  
    public static final int NETWORK_TYPE_EVDO_A = 6;  
    /** Current network is 1xRTT */  
    public static final int NETWORK_TYPE_1xRTT = 7;  
    /** Current network is HSDPA */  
    public static final int NETWORK_TYPE_HSDPA = 8;  
    /** Current network is HSUPA */  
    public static final int NETWORK_TYPE_HSUPA = 9;  
    /** Current network is HSPA */  
    public static final int NETWORK_TYPE_HSPA = 10;  
    /** Current network is iDen */  
    public static final int NETWORK_TYPE_IDEN = 11;  
    /** Current network is EVDO revision B */  
    public static final int NETWORK_TYPE_EVDO_B = 12;  
    /** Current network is LTE */  
    public static final int NETWORK_TYPE_LTE = 13;  
    /** Current network is eHRPD */  
    public static final int NETWORK_TYPE_EHRPD = 14;  
    /** Current network is HSPA+ */  
    public static final int NETWORK_TYPE_HSPAP = 15;  
    //是否打開了移動資料流量
  	private static boolean mobileNetwork = false;
  	//是否打開了無線
  	private static boolean wifiNetwork= false;
	private static Context context;
	
	private static Utils utils;
	private Utils(Context context){
		this.context = context;
	}
	public static Utils getUtils(Context context){
		if(utils == null){
			utils = new Utils(context);
			return utils;
		}
		return utils;
	}
	public static String getInfos(){
		// 營運商
	    String provider;
		// 資料流量類型 --- 2G,3G,4G
		String type;
		// 手機品牌型号 
		String model;
		provider = getProvider(context);
		model = android.os.Build.MODEL;
		type = getNetworkInfo();
		return provider+type+model;
	}
	/** 
     * 擷取營運商 
     *  
     * @return 
     */  
    public static String getProvider(Context context) {  
        String provider = "未知";  
        try {  
            TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);  
            String IMSI = telephonyManager.getSubscriberId();  
            if (IMSI == null) {  
                if (TelephonyManager.SIM_STATE_READY == telephonyManager  
                        .getSimState()) {  
                    String operator = telephonyManager.getSimOperator();  
                    if (operator != null) {  
                        if (operator.equals("46000")  
                                || operator.equals("46002")  
                                || operator.equals("46007")) {  
                            provider = "中國移動";  
                        } else if (operator.equals("46001")) {  
                            provider = "中國聯通";  
                        } else if (operator.equals("46003")) {  
                            provider = "中國電信";  
                        }  
                    }  
                }  
            } else {  
                if (IMSI.startsWith("46000") || IMSI.startsWith("46002")  
                        || IMSI.startsWith("46007")) {  
                    provider = "中國移動";  
                } else if (IMSI.startsWith("46001")) {  
                    provider = "中國聯通";  
                } else if (IMSI.startsWith("46003")) {  
                    provider = "中國電信";  
                }  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return provider;  
    }  
    private static String  getNetworkInfo(){
    	String type = null;
		// 擷取網絡連接配接情況
		ConnectivityManager mConnectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo mobileNetworkInfo = mConnectivity
				.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
		NetworkInfo wifiNetworkInfo = mConnectivity
				.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
		if (mobileNetworkInfo.isConnected()) {
			mobileNetwork = true;
			type = getCurrentNetworkType(context);
		}else{
			mobileNetwork = false;
		}
		if (wifiNetworkInfo.isConnected()) {
			wifiNetwork = true;
		}else{
			wifiNetwork = false;
		}
		return type;
	}
	private static int getNetworkClassByType(int networkType) {  
        switch (networkType) {  
        case NETWORK_TYPE_UNAVAILABLE:  
            return NETWORK_CLASS_UNAVAILABLE;  
        case NETWORK_TYPE_WIFI:  
            return NETWORK_CLASS_WIFI;  
        case NETWORK_TYPE_GPRS:  
        case NETWORK_TYPE_EDGE:  
        case NETWORK_TYPE_CDMA:  
        case NETWORK_TYPE_1xRTT:  
        case NETWORK_TYPE_IDEN:  
            return NETWORK_CLASS_2_G;  
        case NETWORK_TYPE_UMTS:  
        case NETWORK_TYPE_EVDO_0:  
        case NETWORK_TYPE_EVDO_A:  
        case NETWORK_TYPE_HSDPA:  
        case NETWORK_TYPE_HSUPA:  
        case NETWORK_TYPE_HSPA:  
        case NETWORK_TYPE_EVDO_B:  
        case NETWORK_TYPE_EHRPD:  
        case NETWORK_TYPE_HSPAP:  
            return NETWORK_CLASS_3_G;  
        case NETWORK_TYPE_LTE:  
            return NETWORK_CLASS_4_G;  
        default:  
            return NETWORK_CLASS_UNKNOWN;  
        }  
    }  
	 /** 
     * 擷取網絡類型 
     *  
     * @return 
     */  
    public static String getCurrentNetworkType(Context  context) {  
        int networkClass = getNetworkClass(context);  
        String type = "未知";  
        switch (networkClass) {  
        case NETWORK_CLASS_UNAVAILABLE:  
            type = "無";  
            break;  
        case NETWORK_CLASS_WIFI:  
            type = "Wi-Fi";  
            break;  
        case NETWORK_CLASS_2_G:  
            type = "2G";  
            break;  
        case NETWORK_CLASS_3_G:  
            type = "3G";  
            break;  
        case NETWORK_CLASS_4_G:  
            type = "4G";  
            break;  
        case NETWORK_CLASS_UNKNOWN:  
            type = "未知";  
            break;  
        }  
        return type;  
    }  
    private static int getNetworkClass(Context  context) {  
        int networkType = NETWORK_TYPE_UNKNOWN;  
        try {  
            final NetworkInfo network = ((ConnectivityManager) 
            		context 
                    .getSystemService(Context.CONNECTIVITY_SERVICE))  
                    .getActiveNetworkInfo();  
            if (network != null && network.isAvailable()  
                    && network.isConnected()) {  
                int type = network.getType();  
                if (type == ConnectivityManager.TYPE_WIFI) {  
                    networkType = NETWORK_TYPE_WIFI;  
                } else if (type == ConnectivityManager.TYPE_MOBILE) {  
                    TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(  
                                    Context.TELEPHONY_SERVICE);  
                    networkType = telephonyManager.getNetworkType();  
                }  
            } else {  
                networkType = NETWORK_TYPE_UNAVAILABLE;  
            }  
  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        }  
        return getNetworkClassByType(networkType);  
  
    }  
}
           

測試結果可以給大家看看

擷取手機品牌機型 手機營運商 以及資料流量類型 是2G還是3G,4G 和 擷取手機目前網絡類型