91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android 監聽網絡狀態的變化及實戰的示例代碼

發布時間:2020-10-07 10:30:03 來源:腳本之家 閱讀:299 作者:gdutxiaoxu 欄目:移動開發

平時我們在請求錯誤的情況下,通常會進行處理一下,一般來說,主要分為兩方面的錯誤

  1. 沒有網絡的錯誤
  2. 在有網絡的情況下,我們客戶端的錯誤或者服務器端的錯誤

今天這篇博客主要闡述以下問題

  1. 怎樣監聽網絡狀態的變化,包括是否打開WiFi,否打開數據網絡,當前連接的網絡是否可用
  2. 網絡沒有打開情況下的處理,如彈出對話框,跳轉到 打開 WiFi設置的界面等
  3. 非WiFi情況下是否加載圖片,是否播放視頻等

實現思路

在網絡錯誤的情況下獲取網絡狀態進行判斷,這種方法是可行的,但你想過了沒有,如果每次都要進行這樣的判斷,豈不是代碼量很多?有人會說,那把代碼封裝到一個類不就好了嗎?這樣確實能減少代碼量,但是每次都要主動去獲取,這樣是不是挺麻煩的。實際上,google 早就幫我們封裝好了,在網絡狀態變化的情況下會發出廣播,我們只需要監聽廣播就好了 。

使用靜態廣播還是動態注冊廣播的方式好呢?

如果你不太清楚的話,我只能說即 基礎不扎實。我們的應用之所以要監聽網絡狀態的 變化,主要是為了在錯誤的情況下方便進行處理,退出我們當前的應用之后當然不需要監聽了,所以選擇動態注冊廣播。

  1. 動態注冊:隨著所在的Activity或者應用銷毀 以后,不會受到該廣播
  2. 靜態注冊:退出應用后,仍然能夠收到相應的廣播

共同點:都需要在AndroidMainest清單文件里面注冊

通過廣播監聽網絡狀態的兩種方法

靜態注冊

<receiver android:name=".network.NetworkConnectChangedReceiver">
  <intent-filter>
    <action android:name="android.NET.conn.CONNECTIVITY_CHANGE" />
    <action android:name="android.Net.wifi.WIFI_STATE_CHANGED" />
    <action android:name="android.net.wifi.STATE_CHANGE" />
  </intent-filter>
</receiver>

動態注冊

第一步:在AndroidMainest文件里面注冊

<receiver android:name=".network.NetworkConnectChangedReceiver">
    </receiver>

第二步:調用 Context registerReceiver(Receiver,IntentFilter) 進行注冊

IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
filter.addAction("android.net.wifi.WIFI_STATE_CHANGED");
filter.addAction("android.net.wifi.STATE_CHANGE");
registerReceiver(mNetworkChangeListener,filter);

我們自定義的NetworkChangeListener廣播

/**
 * 網絡改變監控廣播
 * <p>
 * 監聽網絡的改變狀態,只有在用戶操作網絡連接開關(wifi,mobile)的時候接受廣播,
 * 然后對相應的界面進行相應的操作,并將 狀態 保存在我們的APP里面
 * <p>
 * <p>
 * Created by xujun
 */
public class NetworkConnectChangedReceiver extends BroadcastReceiver {

  private static final String TAG = "xujun";
  public static final String TAG1 = "xxx";

  @Override
  public void onReceive(Context context, Intent intent) {
    // 這個監聽wifi的打開與關閉,與wifi的連接無關
    if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {
      int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
      Log.e(TAG1, "wifiState" + wifiState);
      switch (wifiState) {
        case WifiManager.WIFI_STATE_DISABLED:
          APP.getInstance().setEnablaWifi(false);
          break;
        case WifiManager.WIFI_STATE_DISABLING:

          break;
        case WifiManager.WIFI_STATE_ENABLING:
          break;
        case WifiManager.WIFI_STATE_ENABLED:
          APP.getInstance().setEnablaWifi(true);
          break;
        case WifiManager.WIFI_STATE_UNKNOWN:
          break;
        default:
          break;


      }
    }
    // 這個監聽wifi的連接狀態即是否連上了一個有效無線路由,當上邊廣播的狀態是WifiManager
    // .WIFI_STATE_DISABLING,和WIFI_STATE_DISABLED的時候,根本不會接到這個廣播。
    // 在上邊廣播接到廣播是WifiManager.WIFI_STATE_ENABLED狀態的同時也會接到這個廣播,
    // 當然剛打開wifi肯定還沒有連接到有效的無線
    if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
      Parcelable parcelableExtra = intent
          .getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
      if (null != parcelableExtra) {
        NetworkInfo networkInfo = (NetworkInfo) parcelableExtra;
        State state = networkInfo.getState();
        boolean isConnected = state == State.CONNECTED;// 當然,這邊可以更精確的確定狀態
        Log.e(TAG1, "isConnected" + isConnected);
        if (isConnected) {
          APP.getInstance().setWifi(true);
        } else {
          APP.getInstance().setWifi(false);
        }
      }
    }
    // 這個監聽網絡連接的設置,包括wifi和移動數據的打開和關閉。.
    // 最好用的還是這個監聽。wifi如果打開,關閉,以及連接上可用的連接都會接到監聽。見log
    // 這個廣播的最大弊端是比上邊兩個廣播的反應要慢,如果只是要監聽wifi,我覺得還是用上邊兩個配合比較合適
    if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
      ConnectivityManager manager = (ConnectivityManager) context
          .getSystemService(Context.CONNECTIVITY_SERVICE);
      Log.i(TAG1, "CONNECTIVITY_ACTION");

      NetworkInfo activeNetwork = manager.getActiveNetworkInfo();
      if (activeNetwork != null) { // connected to the internet
        if (activeNetwork.isConnected()) {
          if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
            // connected to wifi
            APP.getInstance().setWifi(true);
            Log.e(TAG, "當前WiFi連接可用 ");
          } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
            // connected to the mobile provider's data plan
            APP.getInstance().setMobile(true);
            Log.e(TAG, "當前移動網絡連接可用 ");
          }
        } else {
          Log.e(TAG, "當前沒有網絡連接,請確保你已經打開網絡 ");
        }


        Log.e(TAG1, "info.getTypeName()" + activeNetwork.getTypeName());
        Log.e(TAG1, "getSubtypeName()" + activeNetwork.getSubtypeName());
        Log.e(TAG1, "getState()" + activeNetwork.getState());
        Log.e(TAG1, "getDetailedState()"
            + activeNetwork.getDetailedState().name());
        Log.e(TAG1, "getDetailedState()" + activeNetwork.getExtraInfo());
        Log.e(TAG1, "getType()" + activeNetwork.getType());
      } else {  // not connected to the internet
        Log.e(TAG, "當前沒有網絡連接,請確保你已經打開網絡 ");
        APP.getInstance().setWifi(false);
        APP.getInstance().setMobile(false);
        APP.getInstance().setConnected(false);
      }
    }
  }
}

 最后,別忘記添加一下權限

<uses-permission android:name="android.permission.INTERNET"/>

 <!--允許讀取網絡狀態-->
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--允許讀取wifi網絡狀態-->
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

思路解析

從上面的代碼中,我們可以知道我們將我們當前的網絡狀態保存在我們的 APP 里面,這樣當網絡狀態變化的時候會自動去改變 APP 里面相應的狀態量,我們進行網絡處理的 時候只需要去獲取 APP里面的狀態量,便可以判斷出是屬于哪一種網絡錯誤,是不是很方便呢。

至于廣播的Action主要有三種類型:

WifiManager.WIFI_STATE_CHANGED_ACTION

這個監聽wifi的打開與關閉,與wifi的連接無關

WifiManager.NETWORK_STATE_CHANGED_ACTION:

這個監聽wifi的連接狀態即是否連上了一個有效無線路由,當上邊廣播的狀態是WifiManager.WIFI_STATE_DISABLING,和WIFI_STATE_DISABLED的時候,根本不會接到這個廣播。

在上邊廣播接到廣播是WifiManager.WIFI_STATE_ENABLED狀態的同時也會接到這個廣播,當然剛打開wifi肯定還沒有連接到有效的無線

ConnectivityManager.CONNECTIVITY_ACTION

這個監聽網絡連接的設置,包括wifi和移動數據的打開和關閉。.

最好用的還是這個監聽。wifi如果打開,關閉,以及連接上可用的連接都會接到監聽。這個廣播的最大弊端是比上邊兩個廣播的反應要慢,如果只是要監聽wifi,我覺得還是用上邊兩個配合比較合適。

至于這個ConnectivityManager,NetworkInfo是什么東西,別急,下面會大概介紹一下。

ConnectivityManager和NetworkInfo

ConnectivityManager主要用來干什么

  1. Monitor network connections (Wi-Fi, GPRS, UMTS, etc.) (用來處理網絡連接 ,包括Wi-Fi, GPRS, UMTS等)
  2. Send broadcast intents when network connectivity changes(用 網絡狀態發生變化的時候發出 廣播 )
  3. Attempt to “fail over” to another network when connectivity to a network is lost(但斷開網絡連接的時候,嘗試去;連接另外一個網絡
  4. Provide an API that allows applications to query the coarse-grained or fine-grained state of the available networks(
  5. Provide an API that allows applications to request and select networks for their data traffic

怎樣獲取ConnectivityManager對象呢?

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context
    .CONNECTIVITY_SERVICE);

獲取 NetworkInfo對象

主要有一下 幾種方法

  1. getNetworkInfo(int networkType),但是這個方法已經過時,官網的解釋如下:This method was deprecated in API level 23. This method does not support multiple connected networks of the same type. Use getAllNetworks() and getNetworkInfo(android.net.Network) instead.
  2. getNetworkInfo(Network network)
  3. getActiveNetwork()
  4. Returns a Network object corresponding to the currently active default data network.
  5. getActiveNetworkInfo(),Returns details about the currently active default data network.
  6. getAllNetworkInfo()這個方法已經過時,Use getAllNetworks() and getNetworkInfo(android.net.Network) instead.

綜上所述,我們如果要知道當前Mobile網絡或者WiFi網絡是否已經連接上,總共有兩種方法。

第一種方法,只不過在 API23的時候已經 過時了

State wifiState = null;
State mobileState = null;

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context
    .CONNECTIVITY_SERVICE);
wifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
mobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();

Log.d(TAG1,
    "wifi狀態:" + wifiState + "\n mobile狀態:" + mobileState);

if (wifiState != null && mobileState != null
    && State.CONNECTED != wifiState
    && State.CONNECTED == mobileState) {// 手機網絡連接成功 
  Log.d(TAG1, "手機2g/3g/4g網絡連接成功");

  APP.getInstance().setMobile(true);
  APP.getInstance().setWifi(false);
  APP.getInstance().setConnected(true);

} else if (wifiState != null && State.CONNECTED == wifiState) {// 無線網絡連接成功 
  Log.d(TAG1, "無線網絡連接成功");

  APP.getInstance().setMobile(false);
  APP.getInstance().setWifi(true);
  APP.getInstance().setConnected(true);

} else if (wifiState != null && mobileState != null
    && State.CONNECTED != wifiState
    && State.CONNECTED != mobileState) {// 手機沒有任何的網絡 
  Log.d(TAG1, "手機沒有任何的網絡");

  APP.getInstance().setMobile(false);
  APP.getInstance().setWifi(false);
  APP.getInstance().setConnected(false);

}

第二種方法

ConnectivityManager manager = (ConnectivityManager) context
    .getSystemService(Context.CONNECTIVITY_SERVICE);
Log.i(TAG1, "CONNECTIVITY_ACTION");

NetworkInfo activeNetwork = manager.getActiveNetworkInfo();
if (activeNetwork != null) { // connected to the internet
  if (activeNetwork.isConnected()) {
    if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
      // connected to wifi
      APP.getInstance().setWifi(true);
      Log.e(TAG, "當前WiFi連接可用 ");
    } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
      // connected to the mobile provider's data plan
      APP.getInstance().setMobile(true);
      Log.e(TAG, "當前移動網絡連接可用 ");
    }
  } else {
    Log.e(TAG, "當前沒有網絡連接,請確保你已經打開網絡 ");
  }
} else {  // not connected to the internet
  Log.e(TAG, "當前沒有網絡連接,請確保你已經打開網絡 ");
  APP.getInstance().setWifi(false);
  APP.getInstance().setMobile(false);
  APP.getInstance().setConnected(false);
}

網絡錯誤情況的處理

正如前面所提到的,這篇博客吧網絡錯誤主要分為兩大類

  1. 沒有網絡情況的錯誤
  2. 在有網絡的情況下,我們客戶端的錯誤或者服務器端的錯誤

在這里 我們主要處理沒有網絡情況下的錯誤,現在 個人了解到 的主要有兩種處理方法。

第一種做法

在APP啟動的 時候檢查當前是否已經連接上網絡,彈出一個對話框沒有的話跳轉到設置界面或者WiFi設置界面或者打開移動網絡界面 。

第二種方法

其實跟第一種做法差不多,只是在每一次 錯誤的情況下,都會判斷當前有沒有 網絡 ,沒有彈出一個對話框,跳轉到設置界面或者WiFi設置界面或者打開移動網絡界面 , 下面我們我們一起來看一下 怎樣彈出一個對話框,并且跳轉到相應的設置界面

這里我們采取第一種做法,效果圖如下

android 監聽網絡狀態的變化及實戰的示例代碼

代碼如下

public static void showWifiDlg(final Context context) {
  AlertDialog.Builder builder = new AlertDialog.Builder(context.getApplicationContext());
  if (mWifiDialog == null) {
    mWifiDialog = builder.setIcon(R.drawable.ic_launcher)     //
        .setTitle("wifi設置")      //
        .setMessage("當前無網絡").setPositiveButton("設置", new DialogInterface
            .OnClickListener() {

          @Override
          public void onClick(DialogInterface dialog, int which) {
            // 跳轉到系統的網絡設置界面
            Intent intent = null;
            // 先判斷當前系統版本
            if (android.os.Build.VERSION.SDK_INT > 10) { // 3.0以上
              intent = new Intent(android.provider.Settings
                  .ACTION_WIFI_SETTINGS);
            } else {
              intent = new Intent();
              intent.setClassName("com.android.settings",
                  Settings.ACTION_WIFI_SETTINGS);
            }
            if ((context instanceof Application)) {
              intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
            }
            context.startActivity(intent);

          }
        }).setNegativeButton("知道了", null).create();
    // 設置為系統的Dialog,這樣使用Application的時候不會 報錯
    mWifiDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
  }
  mWifiDialog.show();
}

這里對幾個 重要的 Action說一下

ACTION_DATA_ROAMING_SETTINGS : 跳轉到移動網絡設置界面

ACTION_WIFI_SETTINGS

Activity Action: Show settings to allow configuration of Wi-Fi.

ACTION_WIRELESS_SETTINGS

Activity Action: Show settings to allow configuration of wireless controls such as Wi-Fi, Bluetooth and Mobile networks.

關于更多Activity Action,請參考官網地址

需要注意的是

若我們 使用的Context不是Activity 的Context 而是Application的 Context,我們 需要做以下處理 ,否則會報錯

// 設置為系統級別的Dialog
mWifiDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

if ((context instanceof Application)) {              intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
 }
context.startActivity(intent);

在AndroidMainFest中添加以下權限 。

 <!--允許 彈出系統級別的AlterDialog-->
  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

智能無圖

智能無圖,這種瀏覽模式我們平時 很常見,比如在UC瀏覽器中,網易新聞中都有看到這種模式,這種模式的實質就是監聽網絡狀態,再根據是否是WiFi去確定是否加載網絡圖片。

效果圖如下

我們可以看到在開啟智能無圖的情況下,若不是連接WiFi ,我們是不會去加載網絡圖片的。

android 監聽網絡狀態的變化及實戰的示例代碼

實現的核心代碼如下

1)當智能無圖模式變化的時候,我們會把標志存進SharePreferences中

mSwitchWifiPic.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  @Override
  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

    SPUtils.put(SPConstants.isIntelligentNoPic,isChecked);

  }
});

同時我們為了進來的時候界面與SharePreferences中的 isIntelligentNoPic的值保持一致,我們需要調用一下代碼

boolean isIntelligentNoPic = SPUtils.getBoolean(SPConstants.isIntelligentNoPic);
mSwitchWifiPic.setChecked(isIntelligentNoPic);

2)在NewsListAdapter中

// 是否開啟智能無圖模式,true表示開啟智能無圖模式
boolean isIntelligentNoPic = SPUtils.getBoolean(Constants.SPConstants.isIntelligentNoPic);
WriteLogUtil.i("isIntelligentNoPic=" + isIntelligentNoPic);
if (isIntelligentNoPic) {
  if (APP.getInstance().isWifi()) {
    GlideUtils.display(mContext, iv, picUrl);
  } else {
    iv.setImageDrawable(new ColorDrawable(Color.GRAY));
  }

} else {
  GlideUtils.display(mContext, iv, picUrl);
}

至于APP.getInstance().isWifi()表示當前是否連接WiFi,是通過 監聽廣播實現的 ,前面已經說明了,這里就不再闡述了。

拓展工具類

public class NetStateUtils {

  /**
   * 判斷當前網絡是否是移動網絡
   *
   * @param context
   * @return boolean
   */
  public static boolean is3G(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
    if (activeNetInfo != null
        && activeNetInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
      return true;
    }
    return false;
  }

  /**
   * 判斷當前網絡是否是wifi網絡
   *
   * @param context
   * @return boolean
   */
  public static boolean isWifi(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
    if (activeNetInfo != null
        && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {
      return true;
    }
    return false;
  }

  /**
   * 判斷當前網絡是否是2G網絡
   *
   * @param context
   * @return boolean
   */
  public static boolean is2G(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
    if (activeNetInfo != null
        && (activeNetInfo.getSubtype() == TelephonyManager.NETWORK_TYPE_EDGE
        || activeNetInfo.getSubtype() == TelephonyManager.NETWORK_TYPE_GPRS || activeNetInfo
        .getSubtype() == TelephonyManager.NETWORK_TYPE_CDMA)) {
      return true;
    }
    return false;
  }

  /**
   * wifi是否打開
   */
  public static boolean isWifiEnabled(Context context) {
    ConnectivityManager mgrConn = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
    TelephonyManager mgrTel = (TelephonyManager) context
        .getSystemService(Context.TELEPHONY_SERVICE);
    return ((mgrConn.getActiveNetworkInfo() != null && mgrConn
        .getActiveNetworkInfo().getState() == NetworkInfo.State.CONNECTED) || mgrTel
        .getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS);
  }

  /**
   * 判斷是否有網絡連接
   *
   * @param context
   * @return
   */
  public static boolean isNetworkConnected(Context context) {
    if (context != null) {
      // 獲取手機所有連接管理對象(包括對wi-fi,net等連接的管理)
      ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context
          .CONNECTIVITY_SERVICE);
      // 獲取NetworkInfo對象
      NetworkInfo networkInfo = manager.getActiveNetworkInfo();
      //判斷NetworkInfo對象是否為空
      if (networkInfo != null)
        return networkInfo.isAvailable();
    }
    return false;
  }

  /**
   * 判斷MOBILE網絡是否可用
   *
   * @param context
   * @param context
   * @return
   */
  public static boolean isMobileConnected(Context context) {
    if (context != null) {
      //獲取手機所有連接管理對象(包括對wi-fi,net等連接的管理)
      ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context
          .CONNECTIVITY_SERVICE);
      //獲取NetworkInfo對象
      NetworkInfo networkInfo = manager.getActiveNetworkInfo();
      //判斷NetworkInfo對象是否為空 并且類型是否為MOBILE
      if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
        return networkInfo.isAvailable();
    }
    return false;
  }

  /**
   * 獲取當前網絡連接的類型信息
   * 原生
   *
   * @param context
   * @return
   */
  public static int getConnectedType(Context context) {
    if (context != null) {
      //獲取手機所有連接管理對象
      ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context
          .CONNECTIVITY_SERVICE);
      //獲取NetworkInfo對象
      NetworkInfo networkInfo = manager.getActiveNetworkInfo();
      if (networkInfo != null && networkInfo.isAvailable()) {
        //返回NetworkInfo的類型
        return networkInfo.getType();
      }
    }
    return -1;
  }

  /**
   * 獲取當前的網絡狀態 :沒有網絡-0:WIFI網絡1:4G網絡-4:3G網絡-3:2G網絡-2
   * 自定義
   *
   * @param context
   * @return
   */
  public static int getAPNType(Context context) {
    //結果返回值
    int netType = 0;
    //獲取手機所有連接管理對象
    ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context
        .CONNECTIVITY_SERVICE);
    //獲取NetworkInfo對象
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();
    //NetworkInfo對象為空 則代表沒有網絡
    if (networkInfo == null) {
      return netType;
    }
    //否則 NetworkInfo對象不為空 則獲取該networkInfo的類型
    int nType = networkInfo.getType();
    if (nType == ConnectivityManager.TYPE_WIFI) {
      //WIFI
      netType = 1;
    } else if (nType == ConnectivityManager.TYPE_MOBILE) {
      int nSubType = networkInfo.getSubtype();
      TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService
          (Context.TELEPHONY_SERVICE);
      //3G  聯通的3G為UMTS或HSDPA 電信的3G為EVDO
      if (nSubType == TelephonyManager.NETWORK_TYPE_LTE
          && !telephonyManager.isNetworkRoaming()) {
        netType = 4;
      } else if (nSubType == TelephonyManager.NETWORK_TYPE_UMTS
          || nSubType == TelephonyManager.NETWORK_TYPE_HSDPA
          || nSubType == TelephonyManager.NETWORK_TYPE_EVDO_0
          && !telephonyManager.isNetworkRoaming()) {
        netType = 3;
        //2G 移動和聯通的2G為GPRS或EGDE,電信的2G為CDMA
      } else if (nSubType == TelephonyManager.NETWORK_TYPE_GPRS
          || nSubType == TelephonyManager.NETWORK_TYPE_EDGE
          || nSubType == TelephonyManager.NETWORK_TYPE_CDMA
          && !telephonyManager.isNetworkRoaming()) {
        netType = 2;
      } else {
        netType = 2;
      }
    }
    return netType;
  }

  /**
   * 判斷GPS是否打開
   * ACCESS_FINE_LOCATION權限
   *
   * @param context
   * @return
   */
  public static boolean isGPSEnabled(Context context) {
    //獲取手機所有連接LOCATION_SERVICE對象
    LocationManager locationManager = ((LocationManager) context.getSystemService(Context
        .LOCATION_SERVICE));
    return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
  }

  /**
   * 獲得本機ip地址
   *
   * @return
   */
  public static String GetHostIp() {
    try {
      for (Enumeration<NetworkInterface> en = NetworkInterface
          .getNetworkInterfaces(); en.hasMoreElements(); ) {
        NetworkInterface intf = en.nextElement();
        for (Enumeration<InetAddress> ipAddr = intf.getInetAddresses(); ipAddr
            .hasMoreElements(); ) {
          InetAddress inetAddress = ipAddr.nextElement();
          if (!inetAddress.isLoopbackAddress()) {
            return inetAddress.getHostAddress();
          }
        }
      }
    } catch (SocketException ex) {
    } catch (Exception e) {
    }
    return null;
  }

  /**
   * 獲取本機串號imei
   *
   * @param context
   * @return
   */
  public static String getIMEI(Context context) {
    TelephonyManager telephonyManager = (TelephonyManager) context
        .getSystemService(Context.TELEPHONY_SERVICE);
    return telephonyManager.getDeviceId();
  }

  /***
   * 判斷是否有外網連接(普通方法不能判斷外網的網絡是否連接,比如連接上局域網)
   *
   * @return
   */

  public static final boolean ping() {

    String result = null;
    try {
      String ip = "www.baidu.com";// ping 的地址,可以換成任何一種可靠的外網
      Process p = Runtime.getRuntime().exec("ping -c 3 -w 100 " + ip);// ping網址3次
      // 讀取ping的內容,可以不加
      InputStream input = p.getInputStream();
      BufferedReader in = new BufferedReader(new InputStreamReader(input));
      StringBuffer stringBuffer = new StringBuffer();
      String content = "";
      while ((content = in.readLine()) != null) {
        stringBuffer.append(content);
      }
      Log.d("------ping-----", "result content : " + stringBuffer.toString());
      // ping的狀態
      int status = p.waitFor();
      if (status == 0) {
        result = "success";
        return true;
      } else {
        result = "failed";
      }
    } catch (IOException e) {
      result = "IOException";
    } catch (InterruptedException e) {
      result = "InterruptedException";
    } finally {
      Log.d("----result---", "result = " + result);
    }
    return false;

  }
}

源碼下載地址:https://github.com/gdutxiaoxu/FunAPP.git

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

望江县| 卢湾区| 报价| 化德县| 东莞市| 皮山县| 萍乡市| 利津县| 辽阳县| 永嘉县| 宣武区| 雷山县| 江源县| 工布江达县| 康定县| 敖汉旗| 汶川县| 鸡西市| 志丹县| 黎城县| 鹤山市| 曲沃县| 凯里市| 广灵县| 上饶市| 增城市| 乌恰县| 崇礼县| 昌邑市| 靖安县| 樟树市| 沛县| 榕江县| 南投县| 高碑店市| 义乌市| 双峰县| 清新县| 浦县| 农安县| 喀喇沁旗|