1. 程式人生 > >Android 判斷網路狀態,實現app自動靜音

Android 判斷網路狀態,實現app自動靜音

        在實際應用中,我們不希望在公司內網環境下,開啟遊戲就顯示較大的聲音,進而影響其他同事辦公環境。因此,就需要讓app變得智慧,讓app可以根據使用者當前網路狀態,自動進行靜音等操作。本次內容分為兩部分:1. 識別網路環境 2. 實現app自動靜音。

自動靜音

           首先是實現自動靜音功能。

/**
 * 實現靜音功能
 */
private void silentSwitchOn() {
    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    if (audioManager != null) {
        audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);  //靜音模式
        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, AudioManager.FLAG_PLAY_SOUND);  // 媒體音量設定為0(靜音)
    }
}

       其中AudioManager.STREAM_MUSIC代表媒體音量,也可以替換成其他的型別,獲取其他型別音量。

監聽音量鍵被按下

      我們通過監聽音量鍵的狀態,來實現靜音,在activity重寫onKeyDown方法。

public boolean onKeyDown(int keyCode, KeyEvent event) {
    Log.d(TAG, "onKeyDown" + keyCode + "" +     (keyCode==KeyEvent.KEYCODE_VOLUME_UP));
    if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
    // 音量+鍵
   }
   if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN){
   // 音量-鍵
    }
}

識別網路環境

        下面是重頭戲,在我們的App進行網路請求時,經常會遇到斷網,重連,資料流量和WIFI變化等情況,那麼我們要怎麼去判斷當前的情況呢?接下來就給大家介紹常用的網路狀態判斷方法。

  • 判斷是否有網路連線
  • 判斷WIFI網路是否可用
  • 判斷資料流量是否可用
  • 獲取當前網路連線的型別資訊
  • 獲取當前的網路狀態
  • 判斷是否是公司內網

首先在登錄檔中獲得網路狀態許可權:

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

1.判讀是否有網路連線

public static boolean isNetworkConnected(Context context) { 
        if (context != null) { 
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();             if (mNetworkInfo != null) { 
        return mNetworkInfo.isAvailable(); } 
        } 
   return false; 
}

有網時返回true,沒網時返回false。

2. 判斷WIFI網路是否可用

public static boolean isWifiConnected(Context context) { 
        if (context != null) { 
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); 
            NetworkInfo mWiFiNetworkInfo = mConnectivityManager .getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
            if (mWiFiNetworkInfo != null) { 
                return mWiFiNetworkInfo.isAvailable();
             }
         }
 return false; 
}

是WIFI網路返回true,不是WIFI返回false。

3. 判斷資料流量是否可用

public static int getConnectedType(Context context) { 
        if (context != null) {
             ConnectivityManager mConnectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); 
             NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); 
            if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
                     return mNetworkInfo.getType(); 
                }
        } 
    return -1; 
}

是資料流量時返回true,不是返回false。

4. 獲取當前網路連線的型別資訊

public static int getConnectedType(Context context) { 
            if (context != null) { 
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); 
            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();         
            if (mNetworkInfo != null && mNetworkInfo.isAvailable()) { 
                     return mNetworkInfo.getType(); 
            }
      }
 return -1; 
}

5. 獲取當前的網路狀態

/**
 * 沒有網路:0 WIFI網路:1 3G網路:2 2G網路:3     
 */
public static int getAPNType(Context context) { 
        int netType = 0; ConnectivityManager connMgr = (ConnectivityManager)     context .getSystemService(Context.CONNECTIVITY_SERVICE); 
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 
        if (networkInfo == null) { 
                return netType; 
            }
        int nType = networkInfo.getType();
             if (nType == ConnectivityManager.TYPE_WIFI) {
             netType = 1;// wifi 
             } else if (nType == ConnectivityManager.TYPE_MOBILE) {
                 int nSubType = networkInfo.getSubtype(); 
                 TelephonyManager mTelephony = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); 
                if (nSubType == TelephonyManager.NETWORK_TYPE_UMTS && !mTelephony.isNetworkRoaming()) { 
                netType = 2;// 3G 
            } else { netType = 3;// 2G } 
        } 
     return netType; 
}

6. 判斷是否是公司內網網路

/**
 * 判斷是否是內網網路,如果是內網網路,預設靜音
 */
 private void enablePlay() {
    String wifiNameSp = (String) CommonUtils.getMySP(this(上下文), "Wi-Fi名稱(字串)", "wifiName", String.class, "");
    String wifiName = CommonUtils.getConnectWifiSsid();
    if (!TextUtils.isEmpty(wifiNameSp) && !TextUtils.isEmpty(wifiName)
            && CommonUtils.isWifiRequirements(wifiName, wifiNameSp, true)) {
        // 預設靜音
        silentSwitchOn(); // 呼叫開始的靜音方法
    }
}

參考文章