1. 程式人生 > >AndroidTV開發過程中對Wifi網路及Pppoe網路的開關狀態進行判斷

AndroidTV開發過程中對Wifi網路及Pppoe網路的開關狀態進行判斷

  在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"/>

相關推薦

AndroidTV開發過程Wifi網路Pppoe網路開關狀態進行判斷

  在AndroidTV的開發過程中,需要對網路的開關狀態進行判斷,現將判斷程式碼歸納如下: 匯入一個jar包,為了支援Pppoe的Api的呼叫   jar包附在後面的Demo裡面.匯入Demo會出現方法數超過65535的提示,具體的解決方法見:**

二.JSP開發過程遇到的問題解決

java 告訴 概率 share 回車 命令 left wid 應用 轉載自:http://www.cnblogs.com/leftshine/p/5238001.html 一.開發環境問題 問題一:Failed to load the JNI shared library

開發過程遇到的異常處理方法

------Mapped Statements collection already contains value for com.chong.model.AccountMapper.checkAccount ------錯誤原因是由於使用mybatis的AccountMapper.xml

自己開發過程遇到的問題解決辦法

在寫JSP時,通過File-Import- Existing Projects into Workspace 匯入了一個外部工程到當前的工作空間,匯入後工程前面卻出  現了紅叉,用Project-clean 等等方法都無法消除,看Problem提示這樣的錯誤: 意思是說有沒有繫結的classpat

c++開發過程遇到的問題解決方案

    我們可以修改兩個工程檔案來把VS2012的工程檔案一直到VS2010中去。     首先當然是修改解決方案檔案(.sln檔案)。     使用記事本開啟,把裡面的 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual

專案開發過程的細節問題解決方法(Vue,Css)(入門級)

Vue開發填坑 方法methods通用 問題描述: vue開發過程中很多時候,函式方法methods會在各個元件內共用,每個元件都寫個比較多餘。 解決方法: 1.利用CommonJS思想,單獨寫,然後每個元件利用import { function

學習Android過程遇到的問題解決方法——網路請求

在學習Android的網路連線時遇到崩潰或IOException異常(出現的問題就這兩個,但是不穩定)的問題,先上程式碼,看看哪裡錯了(答案在文末) activity_main.xml: 1 <?xml version="1.0" encoding="utf-8"?> 2 <

Android開發過程的坑解決方法收錄(四)

1.某個控制元件要放在Linearlayout佈局的底部(底部導航條) <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.

Android開發過程的坑解決方法收錄

  1.某個控制元件要放在Linearlayout佈局的底部(底部導航條)      <LinearLayout      android:layout_width="match_parent"      android:orientation="vertical"      android:layou

Android Studio開發過程的小插曲(Wifi熱點開發遇到的問題與解決)

今天我參照《Android程式設計經典教程》進行wifi熱點開發。身為菜雞的我依然遇到了一些問題。 上一張截圖吧,免得大家不知道我說的問題在哪裡。 第一個問題: mainactivity.java中,我寫在wifiAdmin中的部分內容到了這裡又不能被識別了。 如

Android 開發過程平時遇到的一些問題總結

相信大家都有面試的經歷,相對比面試官的問的一些問題其實都是基礎的知識,但就是一些基礎的知識我們也不是很完美的回答出來,我們也知道現在的開發人員很多,一家公司一個崗位就會有很多的開發者投遞,在那麼多開發者中你如何讓面試官很深的認識你,給面試官一個很深的印象,能讓他

安卓開發過程遇到的問題總結解決方法

1、每次從github同步程式碼的時候R會變紅 2、佈局檔案顯示不出效果 解決方法:降低API的版本為23或22 3、Android中SwipeRefreshLayout和listview的衝突 4、FloatingActionButton的使用

WEB開發過程遇到的各種問題解決方法總結

A:把MySQL的jar包放在Tomcat安裝目錄下的lib資料夾下 ------------------------------------------------------------------------------------------------ Q:The server does n

Android開發過程的坑解決方法收錄(五)

版本號 如果 出現 過程 androi 分享圖片 onf blog end 1. 導入依賴庫出現錯誤 因為使用的sdk版本不同,使用下列代碼強制使用最低版本,25.3.1就是我當前使用的版本號,根據自己的情況修改 configurations.all {

使用phxpaxos開發過程遇到的坑

例如 exec 永遠 傳輸 snap 如果 poi 沒有 github 1. 開啟BatchPropose後,狀態機使用ExecuteForCheckpoint生成快照要註意: ExecuteForCheckpoint中的InstanceID不能立即持久化。 例如:

ReactJS 開發過程的一些使用心得

有著 dom操作 作者 -s arc 有用 第一個 sets tao ReactJS作為目前最火的構建用戶界面的前端框架,為什麽有那麽多的前端工程師去追逐它,不僅因為它簡單,而且它提供了一系列強大的API讓我們擺脫以前繁瑣的DOM操作,使我們的邏輯更加清晰,代碼更加簡單。

在混合app開發過程使用百度地圖api的出現坐標偏差的解決

百度 api call cordova overlay forum gpo ext ddr 在項目中使用ngCordova的$cordovaGeolocation模塊獲取當前位置經緯度,當展示在百度地圖中時發現有誤差(我的測試誤差為1.7公裏左右),查資料發現百度地圖經緯度

過程遇到的問題解決

extends sql out error .html date 模式 ring clu 1.log 打印異常信息 Logger logger = Logger.getLogger(LoggerTest.class); //追蹤產生此日誌的類 Logger extend

LoadRunner接口腳本編寫過程遇到的問題分享

所有 其中 系統 post方法 等於 打印日誌 腳本 adr ner 工作中需要接口測試,報文編輯器一條條手工發費時費力,因此考慮利用web_submit_data函數POST方法進行報文編輯。在報文編輯中主要遇到了三個問題,其中一個問題耗時兩天查到問題所在,在這裏與大

LoadRunner接口腳本web_submit_data編寫過程遇到的問題分享

排查 adr 奮鬥 如果 所在 方法 val xmla 模式 工作中需要接口測試,報文編輯器一條條手工發費時費力,因此考慮利用web_submit_data函數POST方法進行報文編輯。在報文編輯中主要遇到了三個問題,其中一個問題耗時兩天查到問題所在,在這裏與大家一塊分