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方法進行報文編輯。在報文編輯中主要遇到了三個問題,其中一個問題耗時兩天查到問題所在,在這裏與大家一塊分