Android 判斷網路狀態,實現app自動靜音
阿新 • • 發佈:2019-02-04
在實際應用中,我們不希望在公司內網環境下,開啟遊戲就顯示較大的聲音,進而影響其他同事辦公環境。因此,就需要讓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(); // 呼叫開始的靜音方法
}
}
參考文章