android監聽wifi
A. android wifi切換路由器怎麼監聽
第一步:手機的設置:下載超級終端Better Terminal。各大市場應該大把大把的,我是在豌豆莢上下載的。下載完後在手機安裝上,點擊進入,其中有個選項是開啟gui還是shell,對於我們android開發者來說當然是選擇比較牛逼的shell了。進入後輸入如下內容:
setprop service.adb.tcp.port 5555
stop adbd
start adbd
這樣你的手機就配置好了tcpip的網路調試埠了。
第二步:電腦的配置:將手機通過usb連接到電腦上,cmd到你的androidsdk的目錄下的platform-tools目錄執行:
adb tcpip 5555
將機器上的adb切換為網路模式,後面5555是埠號,當然你也可以寫其他埠號,只要你的手機的這個埠號沒有被使用就可以了.
第三步:電腦配置:運行cmd,輸入
adb connect <你手機IP>:5555
例如:adb connect 10.7.10.3:5555 ,其中10.7.10.3是我的手機的ip地址你輸入你的手機的ip地址即可。
如果成功的話,會提示 connected to 10.7.10.3:5555
現在你的電腦就可以通過wifi連接電腦調試了,當然你通過eclipse進行調試也是沒問題的。
第四步:當你使用完wifi調試的時候,請連接手機後cmd輸入adb usb,切換回usb調試。
B. Android的WiFi功能總結
先進行WiFi許可權的聲明
<!-- 獲取WiFi狀態 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- api <= Android29調用setWifiEnabled -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 定位許可權(api >= 23 用於 WIFI掃描)-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
注意:ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION是危險級許可權需要使用中還需要動態申請,申請其中一個即可。
WifiManager mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.R) {
Intent panelIntent =new Intent(Settings.Panel.ACTION_WIFI);
startActivityForResult(panelIntent,null);
}else{ mWifiManager.setWifiEnabled(!isEnable);}
可以通過監聽系統廣播來了解WiFi狀態。
WIFI_STATE_CHANGED_ACTION:WiFi開關狀態;
SCAN_RESULTS_AVAILABLE_ACTION:WiFi列表變化;
RSSI_CHANGED_ACTION:WiFi信號強度變化。
IntentFilter mFilter =new IntentFilter();
mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
mReceiver =new BroadcastReceiver() {
@Override
public void onReceive(Context context,Intent intent) {
handleEvent(intent);
}
};
registerReceiver(mReceiver, mFilter);
private void handleEvent(Intent intent) {
String action = intent.getAction();
if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
final int wifiState =mWifiManager.getWifiState();
if(wifiState ==WifiManager.WIFI_STATE_ENABLED){
postDelayed(()->{mRefreshLayout.autoRefresh();},1000);
}
}else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) {
}else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
if(System.currentTimeMillis() -mLastUpateWifiRssiTime <1000){//刷新太快
return;
}
}
updateWifiChange();
}
切記:wifistate切換到WifiManager.WIFI_STATE_ENABLED,mWifiManager.isWifiEnabled()需要有個等待時間切換。
3的基礎上解析廣播應答
private void updateWifiChange() {
final int wifiState =mWifiManager.getWifiState();
switch (wifiState) {
case WifiManager.WIFI_STATE_ENABLED:
ArrayListresults = (ArrayList)mWifiManager.getScanResults();
updateApListView(results);
mWlanSb.setChecked(mWifiManager.isWifiEnabled() );
break;
case WifiManager.WIFI_STATE_ENABLING:
break;
case WifiManager.WIFI_STATE_DISABLING:
mAdapter.clearData();
mWlanSb.setChecked(mWifiManager.isWifiEnabled() );
break;
case WifiManager.WIFI_STATE_DISABLED:
break;
}
}
C. android監聽wifi狀態改變的廣播靠譜嗎
1、靠譜,這是android的基本常識!
2、只要wifi的底層驅動和wifi模塊沒有問題,廣播消息不會被其他應用堵塞下,監聽wifi狀態,都會收到wifi狀態改變的消息的!
D. Android 超簡單實現網路狀態的監聽
我們做項目的時候,不可避免的要做網路狀態的監聽,一般我們都是抽取出一個工具類來實現,比如:
細致的你當然還會再寫一個判斷網路類型的方法,反手再來一個例:
然後就可以在相應的操作前進行判斷網路的判斷:
但是這樣做也有些問題:
接下來就是本文的重點,如何通過 NetStatusBus 這個庫來解決以上問題,讓你的網路狀態監聽變得前所未有的簡單粗暴。
到這里就已經結束了,你的所有網路操作已經都可以清晰優雅的在訂閱方法中進行處理了,當然你也可以繼續往下看。
訂閱方法必須填寫一個NetType參數,可以通過NetType的值來判斷當前網路類型。
@NetSubscribe中 netType為可選值,可以設置訂閱的類型,可選值類型如下:
NetType.AUTO
這是默認值,任何網路狀態發生變化,該類型訂閱者都會被回調。同時會傳入NetType參數告知你當前的網路類型,示例如下:
只要當前是由 WIFI 改變引發的網路狀態變化,該類型訂閱者都會被回調。同時會傳入NetType參數告知你當前的網路類型,示例如下:
只要當前是由移動網路改變引發的網路狀態變化,該類型訂閱者都會被回調。同時會傳入NetType參數告知你當前的網路類型,示例如下:
NetType.NONE
只有當網路丟失時,該類型訂閱者才會被回調。
有人會覺得,我用個庫爽就行了管它的原理干什麼?
你放心,我只是小小的描述一下實現方式。
原理簡單來說,就是在全局初始化的時候就綁定對網路的變化監聽。然後將進行注冊的父類所有的訂閱方法保存至集合中,這里涉及到一些方法的校驗,最後在網路狀態發生改變時利用 java 反射機制遍歷執行所有訂閱方法。熟悉 EventBus 的小夥伴已經看出來了這里借鑒了一小部分 EventBus 的思想。
回到第一步,那麼具體是如何綁定對網路狀態變化的監聽呢?
以前我們是通過注冊廣播來實現綁定網路變更的監聽,在Android 7.0 以後,Google 基於性能和安全原因對廣播進行了很多限制,比如監聽網路變更的廣播 android.net.conn.CONNECTIVITY_CHANGE 使用靜態注冊的方式則無法生效,而動態注冊的方式雖然可以生效但畢竟不是最優解。
同樣出於性能和安全,以及擁抱變化的角度,最終我們還是使用官方推薦的方式,利用 ConnectivityManager.NetworkCallback 來進行網路變化的監聽,這是在Android 5.0即android api 21推出的API,目前Android 5.0以上的市場佔有率在 85%以上,隨著國內各大廠商正在積極的推進適配普及Android Q,這個比例還會進一步增大,所以個人人認為無需過於擔心低版本適配。
使用的時候出現這個問題是由於少添加了許可權。
Caused by: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
java.lang.RuntimeException: Unable to create application com.jiyun.wanandroid.WanApplication: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
加上這幾個許可權就好了:
附上原文地址: https://www.jianshu.com/p/2fea980b3e56
E. Android之WIFI-網路可用性校驗(NetworkMonitor)
流程框架
基礎知識
源碼
細節
1.WifiStateMachine在狀態L2ConnectedState時,進行NetworkAgent初始化。
NetworkAgent初始化的過程建立與ConnectivityService通信
2.ConnectivityService的registerNetworkAgent創建NetworkAgentInfo
3.NetworkAgentInfo的初始化,創建NetworkMonitor,而NetworkMonitor則是監聽網路的可用性
4.NetworkMonitor
adb控制
問題
參考學習
F. Android:通過WifiManager監聽Wifi信號強弱
先來了解下Android如何獲取wifi的信息:
WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifi_service.getConnectionInfo();
其中WifiManager是管理wifi的最重要的類,詳細請參考
http://developer.android.com/reference/android/net/wifi/WifiManager.html
其中wifiInfo有以下的方法:
wifiinfo.getBSSID();
wifiinfo.getSSID();
wifiinfo.getIpAddress();獲取IP地址。
wifiinfo.getMacAddress();獲取MAC地址。
wifiinfo.getNetworkId();獲取網路ID。
wifiinfo.getLinkSpeed();獲取連接速度,可以讓用戶獲知這一信息。
wifiinfo.getRssi();獲取RSSI,RSSI就是接受信號強度指示。在這可以直 接和華為提供的Wi-Fi信號閾值進行比較來提供給用戶,讓用戶對網路或地理位置做出調整來獲得最好的連接效果。
這里得到信號強度就靠wifiinfo.getRssi();這個方法。得到的值是一個0到-100的區間值,是一個int型數據,其中0到-50表示信號最好,-50到-70表示信號偏差,小於-70表示最差,有可能連接不上或者掉線,一般Wifi已斷則值為-200。
界面很簡單,只有一個ImageView用來顯示圖片,activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/wifi_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="145dp"
android:layout_gravity="center" />
</LinearLayout>
用於獲得信號強度並改變圖片的Activity:MainActivity
package com.my.phonesingle;
import java.util.Timer;
import java.util.TimerTask;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private WifiInfo wifiInfo = null; //獲得的Wifi信息
private WifiManager wifiManager = null; //Wifi管理器
private Handler handler;
private ImageView wifi_image; //信號圖片顯示
private int level; //信號強度值
@SuppressLint("HandlerLeak")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//圖片控制項初始化
wifi_image = (ImageView) findViewById(R.id.wifi_image);
// 獲得WifiManager
wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
// 使用定時器,每隔5秒獲得一次信號強度值
Timer timer = new Timer();
timer.scheleAtFixedRate(new TimerTask() {
@Override
public void run() {
wifiInfo = wifiManager.getConnectionInfo();
//獲得信號強度值
level = wifiInfo.getRssi();
//根據獲得的信號強度發送信息
if (level <= 0 && level >= -50) {
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
} else if (level < -50 && level >= -70) {
Message msg = new Message();
msg.what = 2;
handler.sendMessage(msg);
} else if (level < -70 && level >= -80) {
Message msg = new Message();
msg.what = 3;
handler.sendMessage(msg);
} else if (level < -80 && level >= -100) {
Message msg = new Message();
msg.what = 4;
handler.sendMessage(msg);
} else {
Message msg = new Message();
msg.what = 5;
handler.sendMessage(msg);
}
}
}, 1000, 5000);
// 使用Handler實現UI線程與Timer線程之間的信息傳遞,每5秒告訴UI線程獲得wifiInto
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
// 如果收到正確的消息就獲取WifiInfo,改變圖片並顯示信號強度
case 1:
wifi_image.setImageResource(R.drawable.single4);
Toast.makeText(MainActivity.this,
"信號強度:" + level + " 信號最好", Toast.LENGTH_SHORT)
.show();
break;
case 2:
wifi_image.setImageResource(R.drawable.single3);
Toast.makeText(MainActivity.this,
"信號強度:" + level + " 信號較好", Toast.LENGTH_SHORT)
.show();
break;
case 3:
wifi_image.setImageResource(R.drawable.single2);
Toast.makeText(MainActivity.this,
"信號強度:" + level + " 信號一般", Toast.LENGTH_SHORT)
.show();
break;
case 4:
wifi_image.setImageResource(R.drawable.single1);
Toast.makeText(MainActivity.this,
"信號強度:" + level + " 信號較差", Toast.LENGTH_SHORT)
.show();
break;
case 5:
wifi_image.setImageResource(R.drawable.single0);
Toast.makeText(MainActivity.this,
"信號強度:" + level + " 無信號", Toast.LENGTH_SHORT)
.show();
break;
default:
//以防萬一
wifi_image.setImageResource(R.drawable.single0);
Toast.makeText(MainActivity.this, "無信號",
Toast.LENGTH_SHORT).show();
}
}
};
}
}
然後只需要打開Wifi測試一下,就行啦!
G. android wifi監聽需要哪些action
需要監聽以下3個action
<action android:name="android.NET.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.Net.wifi.WIFI_STATE_CHANGED" />
<action android:name="android.net.wifi.STATE_CHANGE" />
H. android 監聽到wifi狀態的廣播怎麼存儲
package com.example.floatdialogtest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
public class WifiReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals(WifiManager.RSSI_CHANGED_ACTION)){
//signal strength changed
}
else if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){//wifi連接上與否
System.out.println("網路狀態改變");
NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if(info.getState().equals(NetworkInfo.State.DISCONNECTED)){
System.out.println("wifi網路連接斷開");
}
else if(info.getState().equals(NetworkInfo.State.CONNECTED)){
WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
//獲取當前wifi名稱
System.out.println("連接到網路 " + wifiInfo.getSSID());
}
}
else if(intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)){//wifi打開與否
int wifistate = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED);
if(wifistate == WifiManager.WIFI_STATE_DISABLED){
System.out.println("系統關閉wifi");
}
else if(wifistate == WifiManager.WIFI_STATE_ENABLED){
System.out.println("系統開啟wifi");
}
}
}
}
I. 【原創】安卓開啟WIFI調試
拿手機來調試,一天下來沒多久就滿電了,怕電池hold不住,找了個遠程調試的辦法。下面是操作步驟,給有需要的人幫助。
1、手機開啟USB調試模式
2、將手機連接到電腦上
3、命令行執行adb tcpip 5555(啟動手機上的adbd守護進程,並監聽5555埠,默認埠為5555,可使用其它埠)
4、獲取手機連接的wifi地址(命令行查看adb shell ip address show wlan0)
5、通過adb connect命令連接
註:adb connect需要和adb tcpip所使用的埠一致,如果不一致,則無法連接到該手機。