gpt4 book ai didi

android - 如何让 WifiManger 在 API 29 Android 中工作

转载 作者:行者123 更新时间:2023-12-04 17:33:59 27 4
gpt4 key购买 nike

在使用 wifi 管理器连接到 Esp8266 时,我突然开始收到连接错误。输出说明了一切。我可以扫描并找到正确的 SSID,但是当连接到它时,要么连接被拒绝,要么就是无法连接。查看文档,似乎 wifi 管理器即将过时?和 WifiNetworkSpecifier 应该使用什么?但这仅适用于使用 API29 及更高版本的手机。我需要这个才能在所有手机上使用

我已经从我的电脑连接到 esp8266 并收到回复 - Esp8266 没有连接问题

public class ChooseDevice extends AppCompatActivity {

private WifiManager wifiManager;
private ListView listView;
private ArrayList<String> arrayList = new ArrayList<>();
private ArrayAdapter adapter;
TextView TV_noDevicesFound;

BroadcastReceiver wifiReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
List<ScanResult> results = wifiManager.getScanResults();
unregisterReceiver(this);

for (ScanResult scanResult : results) {
Log.d("Here!!", scanResult.SSID);
if (scanResult.SSID.startsWith("Cessabit")) {
arrayList.add(scanResult.SSID);
adapter.notifyDataSetChanged();

}
}

if (arrayList.size()==0){
TV_noDevicesFound.setVisibility(View.VISIBLE);
}else{
TV_noDevicesFound.setVisibility(View.INVISIBLE);
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choose_device);
TV_noDevicesFound = findViewById(R.id.TV_noDevicesFound);
listView = findViewById(R.id.deviceList);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String Device_SSID = listView.getItemAtPosition(position).toString();
connectToDevice(Device_SSID);
Intent intent = new Intent(ChooseDevice.this, ChooseWifi.class);
startActivity(intent);
}
});

wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);


if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
}


adapter = new ArrayAdapter<>(this, R.layout.layout_list_item, R.id.DeviceTxtView, arrayList);
listView.setAdapter(adapter);
}



private void connectToDevice(String SSID) {
WifiInfo connection;
Log.d("Connecting To SSID: ", SSID);
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = "\"" + SSID + "\"";
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
int netID = wifiManager.addNetwork(conf);
Log.d("netID", ""+netID);
wifiManager.disconnect();
wifiManager.enableNetwork(netID, true);
wifiManager.reconnect();
connection = wifiManager.getConnectionInfo();
String ConnectedSSID = connection.getSSID();
Log.d("Connected To SSID : ", ConnectedSSID);

}

@Override
protected void onStop(){
super.onStop();
try{
unregisterReceiver(wifiReceiver);
}catch(final Exception exception){
Log.d("Receiver try catch","cannot unregister receiver");
}

}
@Override
protected void onStart(){
super.onStart();
arrayList.clear();
registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
wifiManager.startScan();
Toast.makeText(this, "Scanning for Devices ..", Toast.LENGTH_SHORT).show();

}


}

D/Connecting To SSID:: Cessabit-1111
I/zygote: Do partial code cache collection, code=107KB, data=80KB
I/zygote: After code cache collection, code=107KB, data=80KB
Increasing code cache capacity to 512KB
D/netID: -1
V/NativeCrypto: Read error: ssl=0xec4b4768: I/O error during system call, Software caused connection abort
V/NativeCrypto: Write error: ssl=0xec4b4768: I/O error during system call, Broken pipe
V/NativeCrypto: SSL shutdown failed: ssl=0xec4b4768: I/O error during system call, Success
D/Connected To SSID :: <unknown ssid>

最佳答案

您必须为 Android 10 及更高版本执行单独的操作,因为 API 已更改。

使用 WifiNetworkSpecifier 发送您的请求。使用 onAvailable() 中提供的网络对象。

    private void connectToDevice(String SSID) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
WifiInfo connection;
Log.d("Connecting To SSID: ", SSID);
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = "\"" + SSID + "\"";
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
int netID = wifiManager.addNetwork(conf);
Log.d("netID", ""+netID);
wifiManager.disconnect();
wifiManager.enableNetwork(netID, true);
wifiManager.reconnect();
connection = wifiManager.getConnectionInfo();
String ConnectedSSID = connection.getSSID();
Log.d("Connected To SSID : ", ConnectedSSID);
} else {
WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
builder.setSsid(SSID);

WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();

NetworkRequest.Builder networkRequestBuilder = new NetworkRequest.Builder();
networkRequestBuilder1.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
networkRequestBuilder1.setNetworkSpecifier(wifiNetworkSpecifier);

NetworkRequest networkRequest = networkRequestBuilder.build();
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.requestNetwork(networkRequest, networkCallback);
networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
//Use this network object to Send request.
//eg - Using OkHttp library to create a service request

super.onAvailable(network);
}
};
}

}

使用完 Wifi 接入点后

connectivityManager.unregisterNetworkCallback(networkCallback);

关于android - 如何让 WifiManger 在 API 29 Android 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57422623/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com