编写不易,如有转载,请声明出处:http://blog.csdn.net/zxc514257857/article/details/68065312
在AndroidTV的开发过程中,需要对网络的开关状态进行判断,现将判断代码归纳如下:
导入一个jar包,为了支持Pppoe的Api的调用
jar包附在后面的Demo里面.导入Demo会出现方法数超过65535的提示,具体的解决方法见:**
Android中加入依赖库点击运行后报出,com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536 http://blog.csdn.net/zxc514257857/article/details/66997689
Demo展示图片:
没网络的状态图片:
无线网络连接的状态图片
Pppoe网络连接的状态图片:
布局代码如下:
//(layout)activity_main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.test.tvnetwork.activity.MainActivity">
<ImageView
android:layout_margin="10dp"
android:id="@+id/imageView"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_width="40dp"
android:layout_height="40dp"/>
</RelativeLayout>
工具类代码如下:
//(utils)NetUtils
package com.test.tvnetwork.utils;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.URL;
public class NetUtils {
//isConnect判断网络是否连接
public static boolean isConnect = false;
//isCheck判断网络是否检测
public static boolean isCheck = false;
//isPppoeConnect判断pppoe网络是否检测
public static boolean isPppoeConnect = false;
//检测pppoe网络,耗时操作不能放在主线程
private static Thread mThread = null;
//netconfigDetail用于返回的网络图标值
//valueEthernet 判断有线网络是否可用的返回值
//valueWifi 判断无线网络是否可用的返回值
//根据valueEthernet和valueWifi来检测pppoe
int netconfigDetail, valueEthernet, valueWifi;
public int getNetwork(Context mContext) {
isCheck = true;
isConnect = false;
WifiManager mWifiManager;
ConnectivityManager mConnectivityManager;
NetworkInfo ethernetNetInfo;
//获得WifiManager对象
mWifiManager = (WifiManager) mContext
.getSystemService(Context.WIFI_SERVICE);
//获得ConnectivityManager对象
mConnectivityManager = (ConnectivityManager) mContext
.getSystemService(Context.CONNECTIVITY_SERVICE);
//获得NetworkInfo对象
ethernetNetInfo = mConnectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET);
if (ethernetNetInfo.isConnected()) {
//如果有线网连接,值为4
netconfigDetail = 4;
valueEthernet = 1;
} else {
if (mWifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) {
if (mWifiManager.getConnectionInfo().getIpAddress() == 0) {
//如果无线网可用,值为-1
valueWifi = -1;
//如果无线网不可用,值为6
netconfigDetail = 6;
} else {
//如果无线网可用,值为0-3
netconfigDetail = WifiManager.calculateSignalLevel(mWifiManager
.getConnectionInfo().getRssi(), 4);
}
} else if (mWifiManager.getWifiState() == WifiManager.WIFI_STATE_DISABLED) {
//如果无线网不可用,值为5
netconfigDetail = 5;
//如果无线网不可用,值为-1
valueEthernet = -1;
}
}
if (valueWifi < 0 && valueEthernet < 0) {
//满足判断的条件则判断是否可用,判断网络连通(包含了pppoe的检测)
checkPppoe();
} else {
isConnect = true;
isCheck = false;
isPppoeConnect = false;
}
return netconfigDetail;
}
public static void checkPppoe() {
if (mThread != null && !mThread.isInterrupted()) {
//检测前将thread置为null
mThread.interrupt();
mThread = null;
}
if (mThread == null || mThread.isInterrupted()) {
mThread = new Thread(new Runnable() {
public void run() {
isCheck = true;
isConnect = false;
isConnect = isConnected();
isCheck = false;
isPppoeConnect = isConnect;
}
});
mThread.start();
}
}
private static boolean isConnected() {
//发送一个请求用来检测是否已连接网络,并判断通畅
//在这里你也可以ping某个IP,来判断是否已连接
try {
URL url = new URL("http://www.baidu.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("connection", "close");
conn.setConnectTimeout(4000);
conn.setReadTimeout(4000);
BufferedReader reader = null;
try {
conn.connect();
try {
if (conn.getInputStream() != null)
reader = new BufferedReader(new InputStreamReader(
conn.getInputStream()), 512);
} catch (IOException e) {
if (conn.getErrorStream() != null)
reader = new BufferedReader(new InputStreamReader(
conn.getErrorStream()), 512);
}
if (reader != null)
reader.close();
if (conn != null)
conn.disconnect();
return true;
} catch (SocketException e) {
e.printStackTrace();
return false;
} catch (SocketTimeoutException e) {
e.printStackTrace();
return false;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
----------------------------------------------------------------------------------
//(utils)NetCheckUtils
package com.test.tvnetwork.utils;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.ethernet.EthernetManager;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.Message;
import static com.test.tvnetwork.constant.ConFigs.NET;
public class NetCheckUtils {
private Context mContext;
private BroadcastReceiver mReceiver;
private Handler mHandler;
public Boolean isReceiver = false;
private int netCondition;
public NetCheckUtils(Context context, Handler handler) {
mContext = context;
mHandler = handler;
}
//获得网络的具体返回值
public void getNetwork() {
WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
//广播的action有四种,包含了有线网络变化,无线网络变化和网络连接变化
IntentFilter mFilter = new IntentFilter();
mFilter.addAction(EthernetManager.NETWORK_STATE_CHANGED_ACTION);
mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
handleEvent(mContext, intent);
}
};
//注册广播
if (!isReceiver) {
mContext.registerReceiver(mReceiver, mFilter);
isReceiver = true;
}
}
//注销广播
public void unregisterReceiver() {
mContext.unregisterReceiver(mReceiver);
}
private void handleEvent(Context context, Intent intent) {
//处理广播不同action事件
String action = intent.getAction();
if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)
|| WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)
|| ConnectivityManager.CONNECTIVITY_ACTION.equals(action)
|| EthernetManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
netCondition = new NetUtils().getNetwork(mContext);
Message msg = new Message();
msg.obj = netCondition;
msg.what = NET;
//发送消息,通知主页面更新UI
mHandler.sendMessage(msg);
}
}
}
常量类代码如下:
//(constant)Configs
package com.test.tvnetwork.constant;
public class ConFigs {
public static final int NET = 100;
}
Activity中的代码如下:
//(activity)MainActivity
package com.test.tvnetwork.activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ImageView;
import com.test.tvnetwork.R;
import com.test.tvnetwork.utils.NetCheckUtils;
import static com.test.tvnetwork.R.id.imageView;
import static com.test.tvnetwork.constant.ConFigs.NET;
public class MainActivity extends AppCompatActivity {
private ImageView mImageView;
private NetCheckUtils mNetCheckUtils;
//网络监听图片数组
public static int[] mNetLogo = new int[]{R.mipmap.wifi0, R.mipmap.wifi1,
R.mipmap.wifi2, R.mipmap.wifi3, R.mipmap.connect,
R.mipmap.etnerror, R.mipmap.wifinotnormal};
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case NET:
int obj = (int) msg.obj;
Log.e("handleMessage","obj"+obj);
mImageView.setImageResource(mNetLogo[obj]);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
checkNet();
}
@Override
protected void onDestroy() {
super.onDestroy();
mNetCheckUtils.unregisterReceiver();
}
private void initView(){
mImageView = (ImageView) findViewById(imageView);
}
//开启新线程,防止阻塞UI主线程
private void checkNet() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
mNetCheckUtils = new NetCheckUtils(MainActivity.this, handler);//网络
mNetCheckUtils.getNetwork();
}
});
thread.start();
}
}
注意事项
注:本代码仅对有Pppoe端口的AndroidTV有效,手机设备运行可能会报错.
注:需要添加权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
Demo下载请移步:http://download.csdn.net/detail/zxc514257857/9797753
----------因本人才疏学浅,如博客或Demo中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!----------