當前位置:首頁 » 網路管理 » 安卓wifi編程
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

安卓wifi編程

發布時間: 2023-01-31 18:41:39

A. android開發中如果我想代碼實現打開wifi熱點如何實現

1·申請許可權:
android.permission.ACCESS_WIFI_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.WAKE_LOCK
2·獲取WifiManager
wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
3·開啟、關閉wifi
if (wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(false);
} else {
wifiManager.setWifiEnabled(true);
}
4·注意
如果遇到force-close, 選wait即可, 因為啟動wifi需要幾秒鍾, UI如果5妙鍾還沒反映的話, 系統會給你這個force close exception

PS:我以前做過設計讀取系統硬體信息的時候用過,但是很長時間沒用了,這段注釋是從網上來的,希望能幫到你。

B. 安卓編程中,通過什麼方法可以製作連接wifi的按鈕不需要檢測,只需要按下後連接

這個通過插件方式,本身就自帶,軟體要帶記憶密碼腳本

C. 安卓怎麼編程實現wifi安全檢測

在Android中對Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面。主要包括以下幾個類和介面: 1.ScanResult 主要用來描述已經檢測出的接入點,包括接入點的地址,接入點的名稱,身份認證,頻率,信號強度等信息。 2.WifiConfiguration Wifi網路的配置,包括安全設置等。 3.WifiInfo wifi無線連接的描述,包括接入點,網路連接狀態,隱藏的接入點,IP地址,連接速度,MAC地址,網路ID,信號強度等信息。這里簡單介紹一下這里的方法: getBSSID() 獲取BSSID getDetailedStateOf() 獲取客戶端的連通性 getHiddenSSID() 獲得SSID 是否被隱藏 getIpAddress() 獲取IP 地址 getLinkSpeed() 獲得連接的速度 getMacAddress() 獲得Mac 地址 getRssi() 獲得802.11n 網路的信號 getSSID() 獲得SSID getSupplicanState() 返回具體客戶端狀態的信息 4.WifiManager 這個不用說,就是用來管理我們的wifi 連接,這里已經定義好了一些類,可以供我們使用。 獲取WIFI網卡的狀態 WIFI網卡的狀態是由一系列的整形常量來表示的。 1.WIFI_STATE_DISABLED : WIFI網卡不可用(1) 2.WIFI_STATE_DISABLING : WIFI網卡正在關閉(0) 3.WIFI_STATE_ENABLED : WIFI網卡可用(3) 4.WIFI_STATE_ENABLING : WIFI網正在打開(2) (WIFI啟動需要一段時間) 5.WIFI_STATE_UNKNOWN : 未知網卡狀態 最重要的一個就是 你要設置許可權 最重要的一個就是 你要設置許可權 希望幫助到你

D. android開發如何給wifi設備發送指令(手機WIFI能連接上攝像頭)

理論上是可行的。但PC和android之間還是需要通信。

PC上攝像頭,都是由驅動來控制硬體的。程序的請求發送給驅動,然後驅動再發送給操作系統,然後再操作硬體。

程序
------
驅動
------
操作系統
------
硬體

大概就是這個結構。

所以,android控制PC上攝像頭,也就是你得從android發送指令或者數據、控制命令什麼的,然後讓硬體、驅動或者程序作出響應。

android之間,既然臉上了wifi,你完全可以使用TCP/IP或者UDP協議什麼的進行通信。android發送指令或者數據,然後pc上寫個程序監測你指定的TCP/IP或者UDP協議中指明的地址和埠,得到你要的指令和數據,再控制攝像頭即可。

pc控制攝像頭,使用windows的API也可以,使用OpenCV也可以。

這樣就實現你的要求了。

E. android 給我一段代碼,點擊一個按鈕,手機就連上指定的wifi

public class HotspotActivity extends Activity {
private WifiManager wifiManager;
private Button open;
private boolean flag=false;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//獲取wifi管理服務
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
open=(Button)findViewById(R.id.open_hotspot);
//通過按鈕事件設置熱點
open.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//如果是打開狀態就關閉,如果是關閉就打開
flag=!flag;
setWifiApEnabled(flag);
}
});
}

// wifi熱點開關
public boolean setWifiApEnabled(boolean enabled) {
if (enabled) { // disable WiFi in any case
//wifi和熱點不能同時打開,所以打開熱點的時候需要關閉wifi
wifiManager.setWifiEnabled(false);
}
try {
//熱點的配置類
WifiConfiguration apConfig = new WifiConfiguration();
//配置熱點的名稱(可以在名字後面加點隨機數什麼的)
apConfig.SSID = "YRCCONNECTION";
//配置熱點的密碼
apConfig.preSharedKey="12122112";
//通過反射調用設置熱點
Method method = wifiManager.getClass().getMethod(
"setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
//返回熱點打開狀態
return (Boolean) method.invoke(wifiManager, apConfig, enabled);
} catch (Exception e) {
return false;
}
}
}
在人家網易博客上看到的
博主:bsky

F. 安卓開發 WiFi通信

不能實現同時通信,只能相互切換,開啟wifi不會關閉移動網路,只是連接上wifi後,網路通道默認走wifi通道,但是可以設置,優先走移動網路通道,有adb命令:
svc wifi prefer
這個是默認的狀態,有wifi就是wifi優先。
svc data prefer
這個使移動數據連接比wifi優先。有移動數據開啟的話先用移動數據,沒有就用wifi。
另外開啟/關閉 wifi 和移動數據的命令
svc data enable/disable
svc wifi enable/disable

G. 如何以編程方式創建和讀取的WEP / EAP無線網路配置中的Android

1. 第1部分:創建一個無線網路的WEP配置編程 。

第2部分:閱讀一個WEP無線網路配置編程
再次Straighforward。

第3部分:讀一個EAP的WiFi配置編程
現在,這是棘手的。你可以找到它通過香草的Android用戶界面中WifiDialog.java節省了EAP的WiFi配置的代碼。唔夠方便我們在我們的應用程序的代碼,那麼不要!如果你碰巧去嘗試這一點,你會得到錯誤說找不到符號eap,phase,client_cert等。有點詳細的調查EnterpriseFieldis private內WiFiConfiguration類和所有的符號,我們無法找到是類型EnterpriseField。好了,我們已經打了一個路障,我們需要這些欄位讀取/保存一個EAP配置,但我們並沒有以編程方式訪問他們!Java Reflection API救援
好吧,我不是一個Java專家,所以我不會越來越到的反射API的細節,例如,你可以谷歌的教程或到達這里。
為了保持簡短而親切,反射API允許你檢查類,介面,欄位在不知道的類,方法等,還可以實例化新對象,並獲取/設置現場reflection.And,重要的是能思考的幫助您訪問私有的類裡面嗯,這是我們需要做的不是嗎? :)
讓我們來檢查代碼示例現在它顯示了如何讀取一個EAP的WiFi反射API。作為一個片段將記錄配置到一個文件,並將其保存在SD卡....非常漂亮..誒;)反射API概述一點點,我相信ING下面的代碼是很容易。
private static final String INT_PRIVATE_KEY = "private_key";
private static final String INT_PHASE2 = "phase2";
private static final String INT_PASSWORD = "password";
private static final String INT_IDENTITY = "identity";
private static final String INT_EAP = "eap";
private static final String INT_CLIENT_CERT = "client_cert";
private static final String INT_CA_CERT = "ca_cert";
private static final String INT_ANONYMOUS_IDENTITY = "anonymous_identity";
final String INT_ENTERPRISEFIELD_NAME = "android.net.wifi.WifiConfiguration$EnterpriseField";

第4部分:儲存的EAP無線網路配置編程
如果你已經讀過的部分3,您已經了解了反射mojo,在這里工作,如果你是直接跳躍到本節,請在第3部分的代碼段之前,看了介紹,你會加快速度通過代碼來這里微風!
void saveEapConfig(String passString, String userName)
{
/********************************Configuration Strings****************************************************/
final String ENTERPRISE_EAP = "TLS";
final String ENTERPRISE_CLIENT_CERT = " CodeGo.net
final String ENTERPRISE_PRIV_KEY = " CodeGo.net
//CertificateName = Name given to the certificate while installing it

/*Optional Params- My wireless Doesn't use these*/
final String ENTERPRISE_PHASE2 = "";
final String ENTERPRISE_ANON_IDENT = "ABC";
final String ENTERPRISE_CA_CERT = "";
/********************************Configuration Strings****************************************************/

/*Create a WifiConfig*/
WifiConfiguration selectedConfig = new WifiConfiguration();

/*AP Name*/
selectedConfig.SSID = "\"SSID_Name\"";

/*Priority*/
selectedConfig.priority = 40;

/*Enable Hidden SSID*/
selectedConfig.hiddenSSID = true;

/*Key Mgmnt*/
selectedConfig.allowedKeyManagement.clear();
selectedConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
selectedConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);

/*Group Ciphers*/
selectedConfig.allowedGroupCiphers.clear();
selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);

/*Pairwise ciphers*/
selectedConfig.allowedPairwiseCiphers.clear();
selectedConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
selectedConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);

/*Protocols*/
selectedConfig.allowedProtocols.clear();
selectedConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
selectedConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);

// Enterprise Settings
// Reflection magic here too, need access to non-public APIs
try {
// Let the magic start
Class[] wcClasses = WifiConfiguration.class.getClasses();
// null for overzealous java compiler
Class wcEnterpriseField = null;

for (Class wcClass : wcClasses)
if (wcClass.getName().equals(INT_ENTERPRISEFIELD_NAME))
{
wcEnterpriseField = wcClass;
break;
}
boolean noEnterpriseFieldType = false;
if(wcEnterpriseField == null)
noEnterpriseFieldType = true; // Cupcake/Donut access enterprise settings directly

Field wcefAnonymousId = null, wcefCaCert = null, wcefClientCert = null, wcefEap = null, wcefIdentity = null, wcefPassword = null, wcefPhase2 = null, wcefPrivateKey = null;
Field[] wcefFields = WifiConfiguration.class.getFields();
// Dispatching Field vars
for (Field wcefField : wcefFields)
{
if (wcefField.getName().equals(INT_ANONYMOUS_IDENTITY))
wcefAnonymousId = wcefField;
else if (wcefField.getName().equals(INT_CA_CERT))
wcefCaCert = wcefField;
else if (wcefField.getName().equals(INT_CLIENT_CERT))
wcefClientCert = wcefField;
else if (wcefField.getName().equals(INT_EAP))
wcefEap = wcefField;
else if (wcefField.getName().equals(INT_IDENTITY))
wcefIdentity = wcefField;
else if (wcefField.getName().equals(INT_PASSWORD))
wcefPassword = wcefField;
else if (wcefField.getName().equals(INT_PHASE2))
wcefPhase2 = wcefField;
else if (wcefField.getName().equals(INT_PRIVATE_KEY))
wcefPrivateKey = wcefField;
}

Method wcefSetValue = null;
if(!noEnterpriseFieldType){
for(Method m: wcEnterpriseField.getMethods())
//System.out.println(m.getName());
if(m.getName().trim().equals("setValue"))
wcefSetValue = m;
}

/*EAP Method*/
if(!noEnterpriseFieldType)
{
wcefSetValue.invoke(wcefEap.get(selectedConfig), ENTERPRISE_EAP);
}
else
{
wcefEap.set(selectedConfig, ENTERPRISE_EAP);
}
/*EAP Phase 2 Authentication*/
if(!noEnterpriseFieldType)
{
wcefSetValue.invoke(wcefPhase2.get(selectedConfig), ENTERPRISE_PHASE2);
}
else
{
wcefPhase2.set(selectedConfig, ENTERPRISE_PHASE2);
}
/*EAP Anonymous Identity*/
if(!noEnterpriseFieldType)
{
wcefSetValue.invoke(wcefAnonymousId.get(selectedConfig), ENTERPRISE_ANON_IDENT);
}
else
{
wcefAnonymousId.set(selectedConfig, ENTERPRISE_ANON_IDENT);
}
/*EAP CA Certificate*/
if(!noEnterpriseFieldType)
{
wcefSetValue.invoke(wcefCaCert.get(selectedConfig), ENTERPRISE_CA_CERT);
}
else
{
wcefCaCert.set(selectedConfig, ENTERPRISE_CA_CERT);
}
/*EAP Private key*/
if(!noEnterpriseFieldType)
{
wcefSetValue.invoke(wcefPrivateKey.get(selectedConfig), ENTERPRISE_PRIV_KEY);
}
else
{
wcefPrivateKey.set(selectedConfig, ENTERPRISE_PRIV_KEY);
}
/*EAP Identity*/
if(!noEnterpriseFieldType)
{
wcefSetValue.invoke(wcefIdentity.get(selectedConfig), userName);
}
else
{
wcefIdentity.set(selectedConfig, userName);
}
/*EAP Password*/
if(!noEnterpriseFieldType)
{
wcefSetValue.invoke(wcefPassword.get(selectedConfig), passString);
}
else
{
wcefPassword.set(selectedConfig, passString);
}
/*EAp Client certificate*/
if(!noEnterpriseFieldType)
{
wcefSetValue.invoke(wcefClientCert.get(selectedConfig), ENTERPRISE_CLIENT_CERT);
}
else
{
wcefClientCert.set(selectedConfig, ENTERPRISE_CLIENT_CERT);
}
// Adhoc for CM6
// if non-CM6 fails gracefully thanks to nested try-catch

try{
Field wcAdhoc = WifiConfiguration.class.getField("adhocSSID");
Field wcAdhocFreq = WifiConfiguration.class.getField("frequency");
//wcAdhoc.setBoolean(selectedConfig, prefs.getBoolean(PREF_ADHOC,
// false));
wcAdhoc.setBoolean(selectedConfig, false);
int freq = 2462; // default to channel 11
//int freq = Integer.parseInt(prefs.getString(PREF_ADHOC_FREQUENCY,
//"2462")); // default to channel 11
//System.err.println(freq);
wcAdhocFreq.setInt(selectedConfig, freq);
} catch (Exception e)
{
e.printStackTrace();
}

} catch (Exception e)
{
// TODO Auto-generated catch block
// FIXME As above, what should I do here?
e.printStackTrace();
}

WifiManager wifiManag = (WifiManager) getSystemService(Context.WIFI_SERVICE);
boolean res1 = wifiManag.setWifiEnabled(true);
int res = wifiManag.addNetwork(selectedConfig);
Log.d("WifiPreference", "add Network returned " + res );
boolean b = wifiManag.enableNetwork(selectedConfig.networkId, false);
Log.d("WifiPreference", "enableNetwork returned " + b );
boolean c = wifiManag.saveConfiguration();
Log.d("WifiPreference", "Save configuration returned " + c );
boolean d = wifiManag.enableNetwork(res, true);
Log.d("WifiPreference", "enableNetwork returned " + d );
}

以及多數民眾贊成它!我希望這可以幫助開發者丟失,:)

希望這會有所幫助的

H. 如何編寫安卓程序接收單片機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。

I. 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;

}

}

J. android開發中,連接wifi需要使用哪個函數

我也正在搞這個,問題也很多,都還沒解決,這是我在網上查到的方法:
// 添加一個網路並連接
public void AddNetwork(WifiConfiguration wcg) {
int wcgID = mWifiManager.addNetwork(wcg);
mWifiManager.enableNetwork(wcgID, true);
}

但是我有問題就是,首先:ScanResult中獲取的SSID等信息和WifiConfiguration中獲取的SSID信息有什麼不一樣,一個是掃描到的,一個是連接後得到的?這個我不理解。第二:按照上面的連接代碼,只需要得到WifiConfiguration對象就可以了,我通過public List<WifiConfiguration> getConfiguredNetworks ()得到的WifiConfiguration對象就可以拿去連接了?既然我通過這個就能連接,那我拿ScanResult中的信息有什麼用?還有就是,WifiConfiguration對象是在哪個階段能獲取的?啟動Wifi?掃描開始?或者是連接上ap後?我表示很迷茫。第三:怎麼通過代碼設置一台手機為Ap?我找不到相關的方法。第四:假設兩台手機,一台做Ap,一台連接,連接上了,然後數據方面怎麼傳輸?藍牙有個BuletoothSocket和BuletoothServiceSocket,Wifi呢?直接只用JAVA的Socket?