Android 工具 + 生產力網路篇(一)

來源:互聯網
上載者:User

標籤:android   blog   io   os   ar   使用   java   for   sp   

廢話不說,直接上代碼

<pre name="code" class="java">
public class NetworkUtil {
    /** 網路狀態未初始化。請調用init(Context)方法 */
    public static final int NETWORK_UNKNOWN = -1;
    /** 網路狀態不可用(wifi和GPRS均未啟動和串連) */
    public static final int NETWORK_UNAVAILABLE = 0;
    /** wifi已串連 */
    public static final int NETWORK_WIFI_CONNECTED = 1;
    /** wifi未啟動,GPRS已串連 */
    public static final int NETWORK_GPRS_CONNECTED = 2;
    /** wifi已啟動,但未串連任意熱點 */
    public static final int NETWORK_WIFI_ENABLED = 3;
    /** 切換了wifi存取點 */
    public static final int NETWORK_ACTION_WIFI_POINT_CHANGED = 4;
    /** 啟動了WiFi的情況下,轉換到已串連WiFi的狀態 */
    public static final int NETWORK_ACTION_WIFI_ENABLED_TO_CONNECTED = 5;
    /** WiFi失去了串連,但仍處於啟動狀態 */
    public static final int NETWORK_ACTION_WIFI_CONNECTED_TO_ENABLED = 6;


    public static final int NETWORK_ACTION_UNKNOWN = -1;
    public static final int NETWORK_ACTION_TURN_TO_AVAILABLE = 0;
    public static final int NETWORK_ACTION_TURN_TO_UNAVAILABLE = 1;
    public static final int NETWORK_ACTION_GPRS_TO_WIFI = 2;
    public static final int NETWORK_ACTION_WIFI_TO_GPRS = 3;


    private static int networkState = NETWORK_UNKNOWN;
    // 在notifyNetworkStateChanged方法中使用。儲存當前WiFi串連的名稱,以便檢查是否已切換了WiFi存取點
    private static String currentSSID = null;


    /**
     * 擷取當前的網路連接狀態。
     * 
     * @return NetworkUtil.NETWORK_UNAVAILABLE,
     *         NetworkUtil.NETWORK_WIFI_CONNECTED ,
     *         NetworkUtil.NETWORK_GPRS_CONNECTED, NetworkUtil.
     *         NETWORK_WIFI_ENABLED
     */
    public static int getNetworkState() {
        if (networkState == NETWORK_UNKNOWN) {
            init();
        }
        return networkState;
    }


    public static void init() {
        Context context = MainApplication.getContext();


        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        WifiManager wifiManager = (WifiManager) context
                .getSystemService(Context.WIFI_SERVICE);


        State wifiState = null;
        if (connectivityManager.getNetworkInfo(
                ConnectivityManager.TYPE_WIFI) != null) {
            wifiState = connectivityManager.getNetworkInfo(
                    ConnectivityManager.TYPE_WIFI).getState();
        }


        State gprsState = null;
        if (connectivityManager.getNetworkInfo(
                ConnectivityManager.TYPE_MOBILE) != null) {
            gprsState = connectivityManager.getNetworkInfo(
                    ConnectivityManager.TYPE_MOBILE).getState();
        }


        // if (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) {
        // if (wifiState == State.CONNECTED) {
        // networkState = NETWORK_WIFI_CONNECTED;
        // } else {
        // networkState = NETWORK_WIFI_ENABLED;
        // }
        // } else {
        // if (gprsState == State.CONNECTED) {
        // networkState = NETWORK_GPRS_CONNECTED;
        // } else {
        // networkState = NETWORK_UNAVAILABLE;
        // }
        // }
        if (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) {
            if (wifiState == State.CONNECTED) {
                networkState = NETWORK_WIFI_CONNECTED;
            } else {
                if (gprsState == State.CONNECTED) {
                    networkState = NETWORK_GPRS_CONNECTED;
                } else {
                    networkState = NETWORK_WIFI_ENABLED;
                }
            }
        } else {
            if (gprsState == State.CONNECTED) {
                networkState = NETWORK_GPRS_CONNECTED;
            } else {
                networkState = NETWORK_UNAVAILABLE;
            }
        }
    }


    /** 發送網路狀態發生了改變的廣播。 */
    public static void notifyNetworkStateChanged(Context context,
            int stateBefore, int stateAfter) {
        // Log.e("notifyNetworkStateChanged", "stateBefore = " + stateBefore
        // + ", stateAfter = " + stateAfter);


        int code = NETWORK_ACTION_UNKNOWN;
        if (stateBefore == NETWORK_UNAVAILABLE && stateAfter != NETWORK_UNKNOWN
                && stateAfter != NETWORK_UNAVAILABLE) { // 網路狀態不可用轉化為可用
            code = NETWORK_ACTION_TURN_TO_AVAILABLE;
        } else if (stateBefore != NETWORK_UNKNOWN
                && stateBefore != NETWORK_UNAVAILABLE
                && stateAfter == NETWORK_UNAVAILABLE) { // 網路狀態可用轉化為不可用
            code = NETWORK_ACTION_TURN_TO_UNAVAILABLE;
        } else if (stateBefore == NETWORK_GPRS_CONNECTED
                && (stateAfter == NETWORK_WIFI_CONNECTED || stateAfter == NETWORK_WIFI_ENABLED)) { // GPRS轉化為WIFI
            code = NETWORK_ACTION_GPRS_TO_WIFI;
        } else if ((stateBefore == NETWORK_WIFI_CONNECTED || stateBefore == NETWORK_WIFI_ENABLED)
                && stateAfter == NETWORK_GPRS_CONNECTED) { // WIFI轉化為GPRS
            code = NETWORK_ACTION_WIFI_TO_GPRS;
        } else if (stateBefore == NETWORK_WIFI_CONNECTED
                && stateAfter == NETWORK_WIFI_CONNECTED) { // 未關閉WiFi,只是切換了WiFi存取點
            WifiManager wifiManager = (WifiManager) context
                    .getSystemService(Context.WIFI_SERVICE);


            // 擷取WiFi存取點的名稱
            String ssid = wifiManager.getConnectionInfo().getSSID();


            if (currentSSID != null && !currentSSID.equals(ssid)) {
                code = NETWORK_ACTION_WIFI_POINT_CHANGED;
            }
        } else if (stateBefore == NETWORK_WIFI_ENABLED
                && stateAfter == NETWORK_WIFI_CONNECTED) { // WiFi串連了WiFi存取點
            code = NETWORK_ACTION_WIFI_ENABLED_TO_CONNECTED;
        } else if (stateBefore == NETWORK_WIFI_CONNECTED
                && stateAfter == NETWORK_WIFI_ENABLED) { // WiFi與存取點失去了串連
            code = NETWORK_ACTION_WIFI_CONNECTED_TO_ENABLED;
        }


        // 如果是WiFi串連,則儲存當前的ssid,以便檢查WiFi串連是否已更換。
        if (stateAfter == NETWORK_WIFI_CONNECTED) {
            WifiManager wifiManager = (WifiManager) context
                    .getSystemService(Context.WIFI_SERVICE);


            String ssid = wifiManager.getConnectionInfo().getSSID();


            currentSSID = ssid; // 儲存當前的SSID
        }


        if (code != NETWORK_ACTION_UNKNOWN) {
            Intent intent = new Intent();
            intent.setAction("com.suntek.mway.mobilepartner.NETWORK_STATE_CHANGED");
            intent.putExtra("code", code);
            context.sendBroadcast(intent);
        }
    }


    /** 返回當前是否有可用網路 */
    public static boolean isNetworkAvailable() {
        ConnectivityManager connMgr = (ConnectivityManager) MainApplication.getContext()
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        return (networkInfo != null && networkInfo.isConnected());
    }


    /** 返回wifi訊號是否為弱 */
    public static boolean isWifiRSSIWeak(Context context) {
        int rssi = getWifiRssi(context);


        // 0 ~ -50 訊號最強,-50 ~ -70 訊號一般,-70 ~ -100 訊號最差
        if (rssi < -70) { // 訊號最差
            return true;
        } else if (rssi < -60) { // 訊號一般
            return false;
        } else { // 訊號最強
            return false;
        }
    }


    /** 返回wifi訊號是否為弱 */
    public static boolean isWifiRSSIWeak(int rssi) {
        // 0 ~ -50 訊號最強,-50 ~ -70 訊號一般,-70 ~ -100 訊號最差
        if (rssi < -70) { // 訊號最差
            return true;
        } else if (rssi < -60) { // 訊號一般
            return false;
        } else { // 訊號最強
            return false;
        }
    }


    /** 返回wifi訊號強度等級 0-2 */
    public static int getWifiRSSILevel(int rssi) {
        // 0 ~ -50 訊號最強,-50 ~ -70 訊號一般,-70 ~ -100 訊號最差
        if (rssi < -70) { // 訊號最差
            return 0;
        } else if (rssi < -50) { // 訊號一般
            return 1;
        } else { // 訊號最強
            return 2;
        }
    }


    /** 擷取Wifi訊號強度 */
    public static int getWifiRssi(Context context) {
        WifiManager wifiManager = (WifiManager) context
                .getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        return wifiInfo.getRssi();
    }


    /** 判斷當前是否移動網路 */
    public static boolean isUseChinaMobile(Context context) {
        if (!ServiceManager.isPhoneInService()) {
            return false;
        }


        TelephonyManager telManager = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        String operator = telManager.getSimOperator();
        if (operator != null) {
            LogHelper.trace("operator=" + operator);
            if (operator.equals("46000") || operator.equals("46002")) {
                // 中國移動
                return true;
            } else if (operator.equals("46001")) {
                // 中國聯通
                return false;
            } else if (operator.equals("46003")) {
                // 中國電信
                return false;
            }
        }
        return false;
    }


    /** 判斷當前是否wifi網路 */
    public static boolean isConnectWifi() {
        Context context = MainApplication.getContext();
        boolean isWifiConnect = false;
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] networkInfos = cm.getAllNetworkInfo();
        for (int i = 0; i < networkInfos.length; i++) {
            if (networkInfos[i].getState() == NetworkInfo.State.CONNECTED) {
                if (networkInfos[i].getType() == ConnectivityManager.TYPE_MOBILE) {
                    // isWifiConnect = false;
                }
                if (networkInfos[i].getType() == ConnectivityManager.TYPE_WIFI) {
                    isWifiConnect = true;
                }
            }
        }
        return isWifiConnect;
    }
}




Android 工具 + 生產力網路篇(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.