編輯:關於Android編程
一般對網絡的判斷都是判斷是否聯網,不過有時候我們需要知道具體的網絡類型,比如在3g網絡下,百度地圖的定位功能存在很大的偏差,這就需要提前判斷網絡類型針對3g網絡情況做特殊的處理。
關於Android如何檢測網絡的類型,網上代碼很多,但是有用的不多,真正解決了問題的我只找到一篇(見文章末尾網址),為了更好的方便自己理解,對這片文章做了解釋和整理。
在android中判斷網絡需要用到ConnectivityManager,下面的方法演示了如何用ConnectivityManager判斷當前是否聯網:
1 2 3 4 5public
static boolean isNetworkConnected() {
ConnectivityManager
cm = (ConnectivityManager) AppContext.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo
ni = cm.getActiveNetworkInfo();
return
ni !=
null
&& ni.isConnectedOrConnecting();
}
其中有個疑問,isConnectedOrConnecting()
從字面上看是是否連接或者正在連接,如果正在連接的是一個不可用的網絡,那應該算不聯網的吧 ,所以我覺得還是改成isConnected()好些,根據個人的需求吧。
上面只是判斷是否聯網,跟我們的目的還有很大的差距,為了獲得具體的網絡類型需要對NetworkInfo
中的信息進一步分解,NetworkInfo
的getTypeName()方法可以判斷出是wifi還是mobile網絡,與getTypeName()方法對應的是getType方法,返回的是代表連接類型的整形常量,api中標明的有
ConnectivityManager.TYPE_MOBILE,
ConnectivityManager.TYPE_WIFI,
ConnectivityManager.TYPE_WIMAX,
ConnectivityManager.TYPE_ETHERNET,
ConnectivityManager.TYPE_BLUETOOTH
五種,其中只有ConnectivityManager.TYPE_MOBILE, ConnectivityManager.TYPE_WIFI是跟互聯網有關的,可見ConnectivityManager並不是專門管理互聯網連接的,還負責藍牙等連接。
先定義一些整形變量代表不同的網絡:
1 2 3 4 5 6 7 8 9 10/**
沒有網絡 */
public
static final int NETWORKTYPE_INVALID = 0;
/**
wap網絡 */
public
static final int NETWORKTYPE_WAP = 1;
/**
2G網絡 */
public
static final int NETWORKTYPE_2G = 2;
/**
3G和3G以上網絡,或統稱為快速網絡 */
public
static final int NETWORKTYPE_3G = 3;
/**
wifi網絡 */
public
static final int NETWORKTYPE_WIFI = 4;
這些常量將在後面用到。
下面我們通過一個方法來實現判斷是wifi還是移動網絡,如果是移動網絡再通過其他方法進一步分析是3g還是2g:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24/**
*
獲取網絡狀態,wifi,wap,2g,3g.
*
*
@param context 上下文
*
@return int 網絡狀態 {@link #NETWORKTYPE_2G},{@link #NETWORKTYPE_3G}, *{@link #NETWORKTYPE_INVALID},{@link #NETWORKTYPE_WAP}* {@link #NETWORKTYPE_WIFI}
*/
public
static int getNetWorkType(Context context) {
ConnectivityManager
manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo
networkInfo = manager.getActiveNetworkInfo();
if
(networkInfo !=
null
&& networkInfo.isConnected()) {
String
type = networkInfo.getTypeName();
if
(type.equalsIgnoreCase(
"WIFI"
))
{
mNetWorkType
= NETWORKTYPE_WIFI;
}
else
if
(type.equalsIgnoreCase(
"MOBILE"
))
{
String
proxyHost = android.net.Proxy.getDefaultHost();
mNetWorkType
= TextUtils.isEmpty(proxyHost)
?
(isFastMobileNetwork(context) ? NETWORKTYPE_3G : NETWORKTYPE_2G)
:
NETWORKTYPE_WAP;
}
}
else
{
mNetWorkType
= NETWORKTYPE_INVALID;
}
return
mNetWorkType;
}
其中為了區別是3g還是2g我們定義了isFastMobileNetwork(context)
方法,主要用到了TelephonyManager
:
private
static boolean isFastMobileNetwork(Context context) {
TelephonyManager
telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
switch
(telephonyManager.getNetworkType()) {
case
TelephonyManager.NETWORK_TYPE_1xRTT:
return
false
;
//
~ 50-100 kbps
case
TelephonyManager.NETWORK_TYPE_CDMA:
return
false
;
//
~ 14-64 kbps
case
TelephonyManager.NETWORK_TYPE_EDGE:
return
false
;
//
~ 50-100 kbps
case
TelephonyManager.NETWORK_TYPE_EVDO_0:
return
true
;
//
~ 400-1000 kbps
case
TelephonyManager.NETWORK_TYPE_EVDO_A:
return
true
;
//
~ 600-1400 kbps
case
TelephonyManager.NETWORK_TYPE_GPRS:
return
false
;
//
~ 100 kbps
case
TelephonyManager.NETWORK_TYPE_HSDPA:
return
true
;
//
~ 2-14 Mbps
case
TelephonyManager.NETWORK_TYPE_HSPA:
return
true
;
//
~ 700-1700 kbps
case
TelephonyManager.NETWORK_TYPE_HSUPA:
return
true
;
//
~ 1-23 Mbps
case
TelephonyManager.NETWORK_TYPE_UMTS:
return
true
;
//
~ 400-7000 kbps
case
TelephonyManager.NETWORK_TYPE_EHRPD:
return
true
;
//
~ 1-2 Mbps
case
TelephonyManager.NETWORK_TYPE_EVDO_B:
return
true
;
//
~ 5 Mbps
case
TelephonyManager.NETWORK_TYPE_HSPAP:
return
true
;
//
~ 10-20 Mbps
case
TelephonyManager.NETWORK_TYPE_IDEN:
return
false
;
//
~25 kbps
case
TelephonyManager.NETWORK_TYPE_LTE:
return
true
;
//
~ 10+ Mbps
case
TelephonyManager.NETWORK_TYPE_UNKNOWN:
return
false
;
default
:
return
false
;
}
}
整個過程可總結為:第一步通過ConnectivityManager判斷是wifi還是mobile網絡,在通過TelephonyManager判斷移動網絡的類型。
效果圖:看網上的都是兩個view拼接,默認右側的不顯示,水平移動的時候把右側的view顯示出來。但是看最新版QQ上的效果不是這樣的,但給人的感覺卻很好,所以獻丑來一發比較
最近一直在研究android wear SDK,總體感受來說就是和現有的android 其他的開發SDK還是有很多新的東西。例如手機終端與手表端的通信機制,手表端的UI規
Android:AIDL和遠程Service調用本講的內容,理解起來很難,也許你看了很多資料也看不明白,但是用起來缺簡單的要命。所以我們干脆拿一個音樂播放器中進度條的實例
凱撒密碼1. 介紹凱撒密碼作為一種最為古老的對稱加密體制,在古羅馬的時候都已經很流行,他的基本思想是:通過把字母移動一定的位數來實現加密和解密。明文中的所有字母都在字母表