andriod 無網絡邏輯設置和判斷

每個app都會碰到這樣的情況,這樣的文章很多介紹。我今天用的是自己項目用的,直接在代碼裏用就可以了。


直接上代碼

NetworkManagement.java 網絡管理者




import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;

public class NetworkManagement {
	public static final String CTWAP = "ctwap";
	public static final String CTNET = "ctnet";
	public static final String CMWAP = "cmwap";
	public static final String CMNET = "cmnet";
	public static final String NET_3G = "3gnet";
	public static final String WAP_3G = "3gwap";
	public static final String UNIWAP = "uniwap";
	public static final String UNINET = "uninet";

	public static final int TYPE_CT_WAP = 5;
	public static final int TYPE_CT_NET = 6;
	public static final int TYPE_CT_WAP_2G = 7;
	public static final int TYPE_CT_NET_2G = 8;

	public static final int TYPE_CM_WAP = 9;
	public static final int TYPE_CM_NET = 10;
	public static final int TYPE_CM_WAP_2G = 11;
	public static final int TYPE_CM_NET_2G = 12;

	public static final int TYPE_CU_WAP = 13;
	public static final int TYPE_CU_NET = 14;
	public static final int TYPE_CU_WAP_2G = 15;
	public static final int TYPE_CU_NET_2G = 16;

	public static final int TYPE_OTHER = 17;
	public static Uri PREFERRED_APN_URI = Uri
			.parse("content://telephony/carriers/preferapn");

	/** 沒有網絡 */
	public static final int TYPE_NET_WORK_DISABLED = 0;

	/** wifi網絡 */
	public static final int TYPE_WIFI = 4;
	private static ConnectivityManager connectivityManager;
	private static NetworkInfo networkInfo;

	// <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
	// <uses-permission android:name="android.permission.INTERNET"/>
	public NetworkManagement(Context context) {
		// TODO Auto-generated constructor stub
		createConnectivityManager(context);
		createNetworkInfo();
		// NetworkInfo [] networkInfos =
		// connectivityManager.getAllNetworkInfo();
	}

	public static void createConnectivityManager(Context context) {
		connectivityManager = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
	}

	public static void createNetworkInfo() {
		// TelephonyManager telephonyManager =
		// (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
		// int networkType = telephonyManager.getNetworkType();
		networkInfo = connectivityManager.getActiveNetworkInfo();
	}

	/**
	 * 判斷是否爲漫遊
	 * 
	 * @param context
	 * @return
	 */
	public static boolean isRoam(Context context) {
		if (connectivityManager == null) {
			createConnectivityManager(context);
			createNetworkInfo();
		}
		if (networkInfo == null)
			return false;
		if (!networkInfo.isConnected())
			return false;
		if (networkInfo.isRoaming())
			return true;
		return false;
	}

	/**
	 * 判斷網絡是否可用
	 * 
	 * @param context
	 * @return
	 */
	public static boolean isNetworkAvailable(Context context) {
		createConnectivityManager(context);
		createNetworkInfo();
		if (networkInfo == null)
			return false;
		if (!networkInfo.isConnected())
			return false;
		if (networkInfo.isConnected())
			return true;
		return false;
	}

	/***
	 * 判斷Network具體類型(聯通移動wap,電信wap,其他net)
	 * 
	 * */
	public static int checkNetworkType(Context mContext) {
		try {
			final ConnectivityManager connectivityManager = (ConnectivityManager) mContext
					.getSystemService(Context.CONNECTIVITY_SERVICE);
			final NetworkInfo mobNetInfoActivity = connectivityManager
					.getActiveNetworkInfo();
			if (mobNetInfoActivity == null || !mobNetInfoActivity.isAvailable())
				// 注意一:
				// NetworkInfo 爲空或者不可以用的時候正常情況應該是當前沒有可用網絡,
				// 但是有些電信機器,仍可以正常聯網,
				// 所以當成net網絡處理依然嘗試連接網絡。
				// (然後在socket中捕捉異常,進行二次判斷與用戶提示)。
				return TYPE_NET_WORK_DISABLED;
			// NetworkInfo不爲null開始判斷是網絡類型
			int netType = mobNetInfoActivity.getType();
			if (netType == ConnectivityManager.TYPE_WIFI)
				// wifi net處理
				return TYPE_WIFI;
			if (netType == ConnectivityManager.TYPE_MOBILE) {
				// 注意二:
				// 判斷是否電信wap:
				// 不要通過getExtraInfo獲取接入點名稱來判斷類型,
				// 因爲通過目前電信多種機型測試發現接入點名稱大都爲#777或者null,
				// 電信機器wap接入點中要比移動聯通wap接入點多設置一個用戶名和密碼,
				// 所以可以通過這個進行判斷!
				boolean is3G = isFastMobileNetwork(mContext);
				final Cursor c = mContext.getContentResolver().query(
						PREFERRED_APN_URI, null, null, null, null);
				if (c != null) {
					c.moveToFirst();
					final String user = c.getString(c.getColumnIndex("user"));
					if (!TextUtils.isEmpty(user)) {
						if (user.startsWith(CTWAP))
							return is3G ? TYPE_CT_WAP : TYPE_CT_WAP_2G;
						if (user.startsWith(CTNET))
							return is3G ? TYPE_CT_NET : TYPE_CT_NET_2G;
					}
				}
				c.close();
				// 注意三:
				// 判斷是移動聯通wap:
				// 其實還有一種方法通過getString(c.getColumnIndex("proxy")獲取代理ip
				// 來判斷接入點,10.0.0.172就是移動聯通wap,10.0.0.200就是電信wap,但在
				// 實際開發中並不是所有機器都能獲取到接入點代理信息,例如魅族M9 (2.2)等...
				// 所以採用getExtraInfo獲取接入點名字進行判斷
				String netMode = mobNetInfoActivity.getExtraInfo();
				Log.i("", "==================netmode:" + netMode);
				if (netMode != null) {
					// 通過apn名稱判斷是否是聯通和移動wap
					netMode = netMode.toLowerCase();
					if (netMode.equals(CMWAP))
						return is3G ? TYPE_CM_WAP : TYPE_CM_WAP_2G;
					if (netMode.equals(CMNET))
						return is3G ? TYPE_CM_NET : TYPE_CM_NET_2G;
					if (netMode.equals(NET_3G) || netMode.equals(UNINET))
						return is3G ? TYPE_CU_NET : TYPE_CU_NET_2G;
					if (netMode.equals(WAP_3G) || netMode.equals(UNIWAP))
						return is3G ? TYPE_CU_WAP : TYPE_CU_WAP_2G;
				}
			}

		} catch (Exception ex) {
			ex.printStackTrace();
			return TYPE_OTHER;
		}

		return TYPE_OTHER;

	}

	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;

		}
	}

	/**
	 * 打開設置網絡界面
	 * */
	public static void setNetworkMethod(Context context) {
		Intent intent = null;
		// 判斷手機系統的版本 即API大於10 就是3.0或以上版本
		// intent = new Intent(Settings.ACTION_APN_SETTINGS);
		// startActivity(intent);
		if (android.os.Build.VERSION.SDK_INT > 10) {
			intent = new Intent(
					android.provider.Settings.ACTION_WIRELESS_SETTINGS);
			context.startActivity(intent);
			return;
		}
		intent = new Intent();
		ComponentName component = new ComponentName("com.android.settings",
				"com.android.settings.WirelessSettings");
		intent.setComponent(component);
		intent.setAction("android.intent.action.VIEW");
		context.startActivity(intent);
	}

	/**
	 * 打開wifi設置
	 */
	public static void setwifi(Context context) {
		// 3.0以上打開設置界面,也可以直接用ACTION_WIRELESS_SETTINGS打開到wifi界面
		if (android.os.Build.VERSION.SDK_INT > 10) {
			context.startActivity(new Intent(
					android.provider.Settings.ACTION_SETTINGS));
			return;
		}
		context.startActivity(new Intent(
				android.provider.Settings.ACTION_WIRELESS_SETTINGS));
	}

	public static void setSet(Context context) {
		//  com.android.settings.AccessibilitySettings 輔助功能設置
		//   com.android.settings.ActivityPicker 選擇活動
		//   com.android.settings.ApnSettings APN設置
		//   com.android.settings.ApplicationSettings 應用程序設置
		//   com.android.settings.BandMode 設置GSM/UMTS波段
		//   com.android.settings.BatteryInfo 電池信息
		//   com.android.settings.DateTimeSettings 日期和壩上旅遊網時間設置
		//   com.android.settings.DateTimeSettingsSetupWizard 日期和時間設置
		//   com.android.settings.DevelopmentSettings 應用程序設置=》開發設置
		//   com.android.settings.DeviceAdminSettings 設備管理器
		//   com.android.settings.DeviceInfoSettings 關於手機
		//   com.android.settings.Display 顯示——設置顯示字體大小及預覽
		//   com.android.settings.DisplaySettings 顯示設置
		//   com.android.settings.DockSettings 底座設置
		//   com.android.settings.IccLockSettings SIM卡鎖定設置
		//   com.android.settings.InstalledAppDetails 語言和鍵盤設置
		//   com.android.settings.LanguageSettings 語言和鍵盤設置
		//   com.android.settings.LocalePicker 選擇手機語言
		//   com.android.settings.LocalePickerInSetupWizard 選擇手機語言
		//   com.android.settings.ManageApplications 已下載(安裝)軟件列表
		//   com.android.settings.MasterClear 恢復出廠設置
		//   com.android.settings.MediaFormat 格式化手機閃存
		//   com.android.settings.PhysicalKeyboardSettings 設置鍵盤
		//   com.android.settings.PrivacySettings 隱私設置
		//   com.android.settings.ProxySelector 代理設置
		//   com.android.settings.RadioInfo 手機信息
		//   com.android.settings.RunningServices 正在運行的程序(服務)
		//   com.android.settings.SecuritySettings 位置和安全設置
		//   com.android.settings.Settings 系統設置
		//   com.android.settings.SettingsSafetyLegalActivity 安全信息
		//   com.android.settings.SoundSettings 聲音設置
		//   com.android.settings.TestingSettings 測試——顯示手機信息、電池信息、使用情況統計、Wifi
		// information、服務信息
		//   com.android.settings.TetherSettings 綁定與便攜式熱點
		//   com.android.settings.TextToSpeechSettings 文字轉語音設置
		//   com.android.settings.UsageStats 使用情況統計
		//   com.android.settings.UserDictionarySettings 用戶詞典
		//   com.android.settings.VoiceInputOutputSettings 語音輸入與輸出設置
		//   com.android.settings.WirelessSettings 無線和網絡設置
		// Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
		// context.startActivity(intent);
		Intent intent = new Intent(Settings.ACTION_SETTINGS);
		context.startActivity(intent);
	}

	/**
	 * 移動網絡開關
	 */
	private void toggleMobileData(Context context, boolean enabled) {
		ConnectivityManager conMgr = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);

		Class<?> conMgrClass = null; // ConnectivityManager類
		Field iConMgrField = null; // ConnectivityManager類中的字段
		Object iConMgr = null; // IConnectivityManager類的引用
		Class<?> iConMgrClass = null; // IConnectivityManager類
		Method setMobileDataEnabledMethod = null; // setMobileDataEnabled方法

		try {
			// 取得ConnectivityManager類
			conMgrClass = Class.forName(conMgr.getClass().getName());
			// 取得ConnectivityManager類中的對象mService
			iConMgrField = conMgrClass.getDeclaredField("mService");
			// 設置mService可訪問
			iConMgrField.setAccessible(true);
			// 取得mService的實例化類IConnectivityManager
			iConMgr = iConMgrField.get(conMgr);
			// 取得IConnectivityManager類
			iConMgrClass = Class.forName(iConMgr.getClass().getName());
			// 取得IConnectivityManager類中的setMobileDataEnabled(boolean)方法
			setMobileDataEnabledMethod = iConMgrClass.getDeclaredMethod(
					"setMobileDataEnabled", Boolean.TYPE);
			// 設置setMobileDataEnabled方法可訪問
			setMobileDataEnabledMethod.setAccessible(true);
			// 調用setMobileDataEnabled方法
			setMobileDataEnabledMethod.invoke(iConMgr, enabled);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}

}


直接在基礎的BaseActivity使用

BaseActivity.java

/**
	 * 網絡狀況 ,沒有網絡跳轉到無網絡活動界面
	 */
	public void netWork() {
		if (!NetworkManagement.isNetworkAvailable(this)) {
			intent.setClass(this, NoNetworkActivity.class);
			intent.putExtra(Activity.TAG, this.getClass());
			startActivity(intent);
			finish();
		}
	}



NoNetworkActivity.java



import com.qpbox.R;
import com.qpp.util.NetworkManagement;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class NoNetworkActivity extends BaseActivity implements OnClickListener {
	private Class c;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.no_network_activity);
		c = (Class) getIntent().getSerializableExtra(Activity.TAG);
		findViewById(R.id.flash_ly_refresh).setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if (NetworkManagement.isNetworkAvailable(this)) {
			finish();
			intent.setClass(this, c);
			startActivity(intent);
		}
	}
}


no_network_activity.xml




<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/background"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/flash_ly_ll"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:orientation="horizontal" >

        <LinearLayout
            android:id="@+id/flash_ly_refresh"
            android:layout_width="200dip"
            android:layout_height="200dip"
            android:gravity="center"
            android:orientation="vertical" >

            <ImageView
                android:id="@+id/flash_ly_iv"
                android:layout_width="150dip"
                android:layout_height="150dip"
                android:src="@drawable/wifi" />

            <TextView
                android:id="@+id/flash_ly_tv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="網絡鏈接失敗,點擊重試"
                android:textSize="15dip" />
        </LinearLayout>
    </LinearLayout>

</LinearLayout>


最後 記得設置權限

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章