AndroidTV开发过程中对Wifi网络及Pppoe网络的开关状态进行判断

编写不易,如有转载,请声明出处: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中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!----------

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamBackTo

感谢各位金主大大(* _ *)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值