android WIFI to unity
本案例实现安卓自动搜索附近wifi和连接wifi,参考了网上很多人的做法,最终总结出来的一套个人觉得比较清晰的案例,给大家分享一下,最终做成jar包给unity服务。
一:wifi涉及到的权限
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />允许程序改变网络连接状态
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 允许程序改变Wi-Fi连接状态
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 获取网络信息状态
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 获取当前WiFi接入的状态以及WLAN热点的信息
<uses-permission android:name="android.permission.WAKE_LOCK" /> 允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失
<uses-permission android:name="android.permission.INTERNET" /> 访问网络连接
二:android系统相关wifi类
WifiManager
wifi管理的API,包括wifi的扫描,建立连接,配置,断开连接等等。
wifiManager.isWifiEnabled();//判断是否开启
wifiManager.setWifiEnabled(true);//设置开启关闭
注意,调用setWifiEnabled后,系统进行wifi模块的开启需要一定时间,此时通过wifiManager.getWifiState()获取的状态来判断是否完成。
WifiManager.WIFI_STATE_DISABLED : WIFI网卡不可用(1)
WifiManager.WIFI_STATE_DISABLING : WIFI网卡正在关闭(0)
WifiManager.WIFI_STATE_ENABLED : WIFI网卡可用(3)
WifiManager.WIFI_STATE_ENABLING : WIFI网正在打开(2) (WIFI启动需要一段时间)
WifiManager.WIFI_STATE_UNKNOWN : 未知网卡状态
具体参考:http://developer.android.com/reference/android/net/wifi/WifiManager.html
WifiInfo
描述已经建立连接的wifi信息。包括ip,mac地址,连接速度
具体参考:http://developer.android.com/reference/android/net/wifi/WifiInfo.html
ConnectivityManager
监控网络连接,当网络连接发生变化时返送广播,当一个网络请求连接失败的时候他会自动转到其他可连接网络等等
获取方式Context.getSystemService(Context.CONNECTIVITY_SERVICE)
具体参考:https://developer.android.com/reference/android/net/ConnectivityManager.html
WifiLock (WifiManager.WifiLock)
它是wifiManager里面的一个类。服务于WifiManager。当无线wifi有一段事件没用的时候系统可能会自动关闭,WifiLock 可以让无线wifi保持唤醒状态
具体参考:https://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html
ScanResult(包是:android.net.wifi。不要import错包,因为蓝牙包中android.blutooth.le也有这个类)
开启扫描后搜索到的wifi热点的信息,包括SSID,Capbilities,frequency,level等等
具体介绍参考:http://developer.android.com/reference/android/net/wifi/ScanResult.html
WifiConfiguration
描述wifi的连接信息,包括SSID,SSID隐藏,password等等设置。
具体介绍参考:https://developer.android.com/reference/android/net/wifi/WifiConfiguration.html
二:android工程(报名也要修改成unity工程包名字)
1:PTWifiConnect
package com.yxh.wifi;
import java.util.List;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
public class PTWifiConnect {
WifiManager wifiManager;
//wifi连接类型
public enum WifiCipherType{
WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID
}
public PTWifiConnect(WifiManager wifiManager){
this.wifiManager = wifiManager;
}
private boolean openWifi() {
boolean bRet = true;
if (!wifiManager.isWifiEnabled()) {
bRet = wifiManager.setWifiEnabled(true);
}
return bRet;
}
public boolean connect(String SSID, String Password, WifiCipherType Type) {
if (!this.openWifi()) {
return false;
}
while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {
try {
Thread.currentThread();
Thread.sleep(100);
} catch (InterruptedException ie) {
}
}
WifiConfiguration wifiConfig = this
.createWifiInfo(SSID, Password, Type);
//
if (wifiConfig == null) {
return false;
}
WifiConfiguration tempConfig = this.isExsits(SSID);
if (tempConfig != null) {
wifiManager.removeNetwork(tempConfig.networkId);
}
int netID = wifiManager.addNetwork(wifiConfig);
boolean bRet = wifiManager.enableNetwork(netID, false);
return bRet;
}
private WifiConfiguration isExsits(String SSID) {
List<WifiConfiguration> existingConfigs = wifiManager
.getConfiguredNetworks();
for (WifiConfiguration existingConfig : existingConfigs) {
if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
return existingConfig;
}
}
return null;
}
private WifiConfiguration createWifiInfo(String SSID, String Password,
WifiCipherType Type) {
WifiConfiguration config = new WifiConfiguration();
config.allowedAuthAlgorithms.clear();
config.allowedGroupCiphers.clear();
config.allowedKeyManagement.clear();
config.allowedPairwiseCiphers.clear();
config.allowedProtocols.clear();
config.SSID = "\"" + SSID + "\"";
if (Type == WifiCipherType.WIFICIPHER_NOPASS) {
config.wepKeys[0] = "";
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
}
if (Type == WifiCipherType.WIFICIPHER_WEP) {
config.preSharedKey = "\"" + Password + "\"";
config.hiddenSSID = true;
config.allowedAuthAlgorithms
.set(WifiConfiguration.AuthAlgorithm.SHARED);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
config.allowedGroupCiphers
.set(WifiConfiguration.GroupCipher.WEP104);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
}
if (Type == WifiCipherType.WIFICIPHER_WPA) {
config.preSharedKey = "\"" + Password + "\"";
config.hiddenSSID = true;
config.allowedAuthAlgorithms
.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
config.status = WifiConfiguration.Status.ENABLED;
} else {
return null;
}
return config;
}
}
2:PTWifiAdministrator (这个类的255行被我写死了wifi密码,注意修改成自己的wifi密码)
package com.yxh.wifi;;
import java.net.Inet4Address;
import java.util.List;
import com.putao.circuit.cnpaigo.PTWifiConnect.WifiCipherType;
import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.WifiLock;
public class PTWifiAdministrator {
private WifiManager wifiManager; //wifi管理api
private WifiInfo wifiInfo; //具体wifi数据api
private List<ScanResult> scanResultList; //wifi扫描结果
private List<WifiConfiguration> wifiConfigurationList;
WifiLock wifiLock;
public PTWifiAdministrator(Context context)
{
wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiInfo = wifiManager.getConnectionInfo();
}
//获取wifi状态
public int GetWifiState()
{
return wifiManager.getWifiState();
}
public void CreateWifiLock()
{
wifiLock = wifiManager.createWifiLock("PTWifiLock");
}
public void AcquireWifiLock()
{
wifiLock.acquire();
}
public List<WifiConfiguration> GetWifiConfiguration()
{
return wifiConfigurationList;
}
public boolean ConnectConfiguration(int index)
{
if(wifiConfigurationList==null||index>wifiConfigurationList.size())
{
return false;
}else{
return wifiManager.enableNetwork(wifiConfigurationList.get(index).networkId, true);
}
}
//开始扫描周为wifi或者热点
public void StartScanWifi()
{
wifiManager.startScan();
scanResultList = wifiManager.getScanResults();
wifiConfigurationList = wifiManager.getConfiguredNetworks();
}
public List<ScanResult> GetScanResults()
{
return scanResultList;
}
//预览扫描到的wifi
public String LookUpScan()
{
StringBuffer sb = new StringBuffer();
for(int i=0;i<scanResultList.size();i++)
{
sb.append(i+":");
sb.append(scanResultList.get(i).SSID+";");
}
return sb.toString();
}
public String GetMacAdress()
{
return wifiInfo==null?null:wifiInfo.getMacAddress();
}
public String GetBSSID()
{
return wifiInfo==null?null:wifiInfo.getBSSID();
}
public int GetIPAdress()
{
return wifiInfo==null?null:wifiInfo.getIpAddress();
}
public int GetNetWordID()
{
return wifiInfo==null?null:wifiInfo.getNetworkId();
}
public String GetWifiInfo()
{
return wifiInfo==null?null:wifiInfo.toString();
}
public void DisConnectWifi(int netId)
{
wifiManager.disableNetwork(netId);
wifiManager.disconnect();
}
//打开wifi
public boolean OpenWifi()
{
if(!wifiManager.isWifiEnabled())
{
return wifiManager.setWifiEnabled(true);
}else{
return true;
}
}
//关闭wifi
public boolean CloseWifi()
{
if(wifiManager.isWifiEnabled())
{
return wifiManager.setWifiEnabled(false);
}
return false;
}
//连接wifi 根据ssid和password
public boolean Connect(String SSID, String Password, PTWifiConnect.WifiCipherType Type)
{
if(!this.OpenWifi())
{
return false;
}
while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {
try {
// Ϊ�˱������һֱwhileѭ��������˯��100�����ڼ�⡭��
Thread.currentThread();
Thread.sleep(100);
} catch (InterruptedException ie) {
}
}
WifiConfiguration wifiConfig = CreateWifiConfiguration(SSID, Password, Type);
if(wifiConfig==null)
{
return false;
}
WifiConfiguration tempConfig = this.IsExist(SSID);
if(tempConfig!=null)
{
wifiManager.removeNetwork(tempConfig.networkId);
}
int netId = wifiManager.addNetwork(wifiConfig);
wifiManager.disconnect();
boolean bRet = wifiManager.enableNetwork(netId, true);
wifiManager.reconnect();
return bRet;
}
//判断当前连接是否和该wifi匹配
public boolean IsConnect(ScanResult result)
{
if(result==null)
return false;
wifiInfo = wifiManager.getConnectionInfo();
String gc = "\""+result.SSID+"\"";
if(wifiInfo!=null&&wifiInfo.getSSID().endsWith(gc))
{
return true;
}else{
return false;
}
}
private WifiConfiguration IsExist(String SSID)
{
List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();
for(WifiConfiguration temp:existingConfigs)
{
if(temp.SSID.equals("\""+SSID+"\""))
{
return temp;
}
}
return null;
}
//生成WifiConfiguration对象 给连接wifi用
private WifiConfiguration CreateWifiConfiguration(String SSID, String Password,PTWifiConnect.WifiCipherType Type)
{
WifiConfiguration wifiConfiguration = new WifiConfiguration();
wifiConfiguration.allowedAuthAlgorithms.clear();
wifiConfiguration.allowedGroupCiphers.clear();
wifiConfiguration.allowedKeyManagement.clear();
wifiConfiguration.allowedPairwiseCiphers.clear();
wifiConfiguration.allowedProtocols.clear();
wifiConfiguration.SSID = "\""+SSID+"\"";
if(Type==WifiCipherType.WIFICIPHER_NOPASS)
{
wifiConfiguration.wepKeys[0] = "";
wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wifiConfiguration.wepTxKeyIndex = 0;
}else if(Type==WifiCipherType.WIFICIPHER_WEP){
wifiConfiguration.preSharedKey = "\"" + Password + "\"";
wifiConfiguration.hiddenSSID = true;
wifiConfiguration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wifiConfiguration.wepTxKeyIndex = 0;
}else if(Type==WifiCipherType.WIFICIPHER_WPA)
{
wifiConfiguration.preSharedKey = "\"" + Password + "\"";
wifiConfiguration.hiddenSSID = true;
wifiConfiguration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
// config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
}else{
return null;
}
return wifiConfiguration;
}
public String ipIntToString(int ip) {
try {
byte[] bytes = new byte[4];
bytes[0] = (byte) (0xff & ip);
bytes[1] = (byte) ((0xff00 & ip) >> 8);
bytes[2] = (byte) ((0xff0000 & ip) >> 16);
bytes[3] = (byte) ((0xff000000 & ip) >> 24);
return Inet4Address.getByAddress(bytes).getHostAddress();
} catch (Exception e) {
return "";
}
}
public int getConnNetId() {
// result.SSID;
wifiInfo = wifiManager.getConnectionInfo();
return wifiInfo.getNetworkId();
}
public boolean connectSpecificAP(ScanResult scan) {
List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
boolean networkInSupplicant = false;
boolean connectResult = false;
// ��������ָ��AP
wifiManager.disconnect();
for (WifiConfiguration w : list) {
// ��ָ��AP ����ת��
// String str = convertToQuotedString(info.ssid);
if (w.BSSID != null && w.BSSID.equals(scan.BSSID)) {
connectResult = wifiManager.enableNetwork(w.networkId, true);
// mWifiManager.saveConfiguration();
networkInSupplicant = true;
break;
}
}
if (!networkInSupplicant) {
WifiConfiguration config = CreateWifiInfo(scan, "youxiaohui");
connectResult = addNetwork(config);
}
return connectResult;
}
public boolean addNetwork(WifiConfiguration wcg) {
if (wcg == null) {
return false;
}
//receiverDhcp = new ReceiverDhcp(ctx, mWifiManager, this, wlanHandler);
//ctx.registerReceiver(receiverDhcp, new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION));
int wcgID = wifiManager.addNetwork(wcg);
boolean b = wifiManager.enableNetwork(wcgID, true);
wifiManager.saveConfiguration();
System.out.println(b);
return b;
}
public WifiConfiguration CreateWifiInfo(ScanResult scan, String Password) {
// Password="ultrapower2013";
// deleteExsits(info.ssid);
WifiConfiguration config = new WifiConfiguration();
config.hiddenSSID = false;
config.status = WifiConfiguration.Status.ENABLED;
if (scan.capabilities.contains("WEP")) {
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.allowedAuthAlgorithms
.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers
.set(WifiConfiguration.GroupCipher.WEP104);
config.SSID = "\"" + scan.SSID + "\"";
config.wepTxKeyIndex = 0;
config.wepKeys[0] = Password;
// config.preSharedKey = "\"" + SHARED_KEY + "\"";
} else if (scan.capabilities.contains("PSK")) {
//
config.SSID = "\"" + scan.SSID + "\"";
config.preSharedKey = "\"" + Password + "\"";
} else if (scan.capabilities.contains("EAP")) {
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
config.allowedAuthAlgorithms
.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
config.SSID = "\"" + scan.SSID + "\"";
config.preSharedKey = "\"" + Password + "\"";
} else {
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.SSID = "\"" + scan.SSID + "\"";
// config.BSSID = info.mac;
config.preSharedKey = null;
//
}
return config;
}
}
3:MainActivity(这个activity主要是给unity交互用的,如果你懂android开发,换成自己的activity就行,把这个类的方法考进去就行)
package com.yxh.wifi;;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
import android.net.wifi.ScanResult;
import android.os.Bundle;
public class MainActivity extends UnityPlayerActivity {
public PTWifiAdministrator ptWifiAdministrator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ptWifiAdministrator = new PTWifiAdministrator(this);
}
//打开wifi
public void OpenWifi()
{
ptWifiAdministrator.OpenWifi();
}
//获取wwifi状态
public boolean GetWifiState()
{
int state_id = ptWifiAdministrator.GetWifiState();
UnityPlayer.UnitySendMessage("PTUnityWifiObject","PTUnityWifiReceive","state:"+state_id);
return state_id==3;
}
ScanResult scanResult;
//连接wifi
public void ConnetWifi(int number)
{
scanResult = ptWifiAdministrator.GetScanResults().get(number);
ptWifiAdministrator.connectSpecificAP(scanResult);
}
//是否连接成功
public boolean IsConnect()
{
boolean b = ptWifiAdministrator.IsConnect(scanResult);
if(b)scanResult = null;
return b;
}
//扫描
public void WifiInit()
{
if(ptWifiAdministrator==null)
ptWifiAdministrator = new PTWifiAdministrator(this);
//UnityPlayer.UnitySendMessage("PTUnityWifiObject","PTUnityWifiReceive","1:lxl;2:yxh");
ptWifiAdministrator.StartScanWifi();
String ScanList = ptWifiAdministrator.LookUpScan();
UnityPlayer.UnitySendMessage("PTUnityWifiObject","PTUnityWifiReceive",ScanList);
}
}
4:androidManifest.xml在unity中这样配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yxh.wifi"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<!-- 以下是使用wifi访问网络所需的权限 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@drawable/app_icon"
android:label="@string/app_name"
>
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
5:unity这边与android交互的类PTUnityWifiObject
using UnityEngine;
using System.Collections;
public class PTUnityWifiObject : MonoBehaviour {
public static PTUnityWifiObject instance;
#if UNITY_ANDROID
private AndroidJavaClass aJC;
private AndroidJavaObject aJO;
#endif
// Use this for initialization
void Start () {
instance = this;
}
public void OpenWifi()
{
#if UNITY_ANDROID
if (aJO == null)
{
aJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
aJO = aJC.GetStatic<AndroidJavaObject>("currentActivity");
}
if (aJO != null)
{
PTWifi.tempT += "OpenWifi";
aJO.Call("OpenWifi");
StartCoroutine(GetOpenIsOk());
}
#endif
}
IEnumerator GetOpenIsOk()
{
yield return new WaitForSeconds(1f);
#if UNITY_ANDROID
if (aJO.Call<bool>("GetWifiState"))
{
//wifi开启成功
SearchWifi();
}
else
{
StartCoroutine(GetOpenIsOk());
}
#endif
}
public void SearchWifi()
{
#if UNITY_ANDROID
if (aJO == null)
{
aJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
aJO = aJC.GetStatic<AndroidJavaObject>("currentActivity");
}
#endif
#if UNITY_ANDROID
if (aJO != null)
{
aJO.Call("WifiInit");
}
#endif
}
//连接wifi
public void ConnectWifi(int number)
{
#if UNITY_ANDROID
if (aJO != null)
{
aJO.Call("ConnetWifi",new object[] { number });
}
#endif
StartCoroutine(WaitConnect());
}
IEnumerator WaitConnect()
{
yield return new WaitForSeconds(0.5f);
#if UNITY_ANDROID
if (aJO != null)
{
if (aJO.Call<bool>("IsConnect"))
{
if(PTWifi.instance!=null&& PTWifi.instance.currentPTWifiPaigoItem!=null)
PTWifi.instance.currentPTWifiPaigoItem.SetConnect();
}
else
{
StartCoroutine(WaitConnect());
}
}
#endif
}
// Update is called once per frame
void Update () {
}
void OnDestory()
{
instance = null;
}
public void PTUnityWifiReceive(string str)
{
if (PTWifi.instance != null)
{
PTWifi.instance.ShowWifi(str);
}
}
}
此项目本人已经跑通了,借鉴了很多别人的知识点,如有已经可以留言,多多交流。
本人qq:344810449,一起研究技术。
android WIFI to unity相关推荐
- Android WiFi开发教程(三)——WiFi热点数据传输
在上一篇文章中介绍了WiFi的搜索和连接,如果你还没阅读过,建议先阅读上一篇Android WiFi开发教程(二)--WiFi的搜索和连接.本篇接着简单介绍手机上如何通过WiFi热点进行数据传输. 跟 ...
- Android Wi-Fi基本操作
2019独角兽企业重金招聘Python工程师标准>>> 从用户角度看,Android Wi-Fi模块自下向上可以看为5层:硬件驱动程序,wpa_suppplicant,JNI,WiF ...
- Android Wi-Fi子系统学习笔记
一.学习目的 了解Android Wi-Fi模组的移植及调试 二.基础知识 1.wifi的两个标志: (1)无线 (2)基于IEEE802.11协议 2.Android wifi模块的三个作用 (1 ...
- Android Wifi开发之WifiConfiguration
最近在写一个和Wifi有关的程序,原来的意图是想去拿到手机当前WIFI连接下的密码.如果是对于有Root过的手机,我们可以从路径:/data/data/com.android.settings/dat ...
- mac android wifi调试
mac android wifi调试 1,用USB连接你的手机: 2,打开命令行输入: adb tcpip 5555; 结果: MacBook-Pro:~ user$ adb tcpip 5555;r ...
- android Wifi开发相关内容
今天,简单讲讲android里如何使用WifiManager. 之前,我看代码时,看到了wifi相关的代码,发现自己对于这个内容的使用还很不熟悉,所以在网上查找资料,最终解决了问题.这里记录一下. 移 ...
- Android开发之Android WIFI ADB(ADB WIFI)无线调试的技巧
老套路线上效果图 以前又adb wifi可以使用,不过那是17年我用的AS2.3版本,并且除了adb wifi这个插件外还得手机安装一个app才可以,特别麻烦. 显示有心插件了->Android ...
- Android wifi驱动的移植 realtek 8188
Android wifi驱动的移植 一般我们拿到的android源代码中wifi应用层部分是好的, 主要是wifi芯片的驱动要移植并添加进去. wifi驱动的移植, 以realtek的8188etv为 ...
- linux wifi开发书籍,Android WIFI开发介绍.pdf
Android WIFI开发介绍: WifiStateTracker 会创建WifiMonitor 接收来自底层的事件,WifiService 和WifiMonitor 是整个模块的核心.WifiSe ...
最新文章
- rk3399 采集摄像头数据_[Camera]摄像头镜像
- java数据通道抽象为流_【java】IO流
- PCB设计用什么软件好?
- C#为什么支持协变的参数只能用于方法的返回值?支持逆变的参数只能用于方法参数?...
- Python中常用的高阶函数
- 使用 HttpLib 来访问 Web 服务
- fs react 使用 保存文件_使用FS进行文件同步和备份
- python 装饰器 java,python之各种装饰器的使用
- KaggleTianChi分类问题相关算法快速实现
- LibLinear(SVM包)使用说明之(三)实践
- linux系统sed语法,22. Linux sed命令
- 第十三章 Spring消息(待续)
- 7种JS脚本分页代码 showPages v1.0
- PCA、PCoA、NMDS、Anosim学习
- 小龙秋招【面试笔记】正式发布,速来围观!(已有40+同学斩获大厂offer)
- 论文 计算机教育教学能力,高校计算机教师应具备的能力和培养的方向
- 什么是缓存雪崩、击穿、穿透?
- 哪个软件配音是免费的?分享这几款好用的配音软件
- 助睡眠的产品盘点,失眠人必须要知道的几样东西
- 研华板卡1742U--瞬时读值 用 instantAiCtrl1 控件
热门文章
- 如何使用dig命令挖掘域名解析信息
- Redis支持php版本,redis支持windows吗
- GitLab删除项目的操作步骤
- 基于 zigbee的城市道路路灯实时远程监控与节能系统
- 【商城应用】商城APP首页方案设计
- Stm32串口通讯的几种方式及其优缺点
- vue双向数据绑定原理 1
- SQL Server复制表数据到另一个表的方法
- iis服务器突然网站访问不了了,iis6 无法访问网站_IIS重启无效(重启服务器才正常 Connections_Refused引起)...
- 武汉性能测试研讨会即将举行!