如何让WifiManger在API 29 Android中工作
在使用wifi管理器连接Esp8266时,我突然收到一个连接错误。输出说明了一切。我可以扫描并找到正确的SSID,但当连接到它时,连接被拒绝或无法连接。查看文档,wifi manager似乎即将推出?那么WifiNetworkSpecifier应该使用什么呢?但这只适用于使用API29及以上的手机。我需要这个在所有手机上工作 我已从电脑连接到esp8266,并收到回复-esp8266没有连接问题如何让WifiManger在API 29 Android中工作,android,wifimanager,Android,Wifimanager,在使用wifi管理器连接Esp8266时,我突然收到一个连接错误。输出说明了一切。我可以扫描并找到正确的SSID,但当连接到它时,连接被拒绝或无法连接。查看文档,wifi manager似乎即将推出?那么WifiNetworkSpecifier应该使用什么呢?但这只适用于使用API29及以上的手机。我需要这个在所有手机上工作 我已从电脑连接到esp8266,并收到回复-esp8266没有连接问题 public class ChooseDevice extends AppCompatActivit
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>
公共类选择设备扩展AppCompative活动{
私人WifiManager WifiManager;
私有列表视图列表视图;
私有ArrayList ArrayList=新ArrayList();
专用阵列适配器;
发现TextView电视节点设备;
BroadcastReceiver wifiReceiver=新的BroadcastReceiver(){
@凌驾
公共void onReceive(上下文、意图){
List results=wifiManager.getScanResults();
未注册接收人(本);
用于(扫描结果扫描结果:结果){
Log.d(“Here!!”,scanResult.SSID);
if(scanResult.SSID.startsWith(“Cessabit”)){
add(scanResult.SSID);
adapter.notifyDataSetChanged();
}
}
if(arrayList.size()=0){
TV_nodeDevices found.setVisibility(View.VISIBLE);
}否则{
TV_nodeDevices found.setVisibility(View.INVISIBLE);
}
}
};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u choose\u device);
TV_noDevicesFound=findviewbyd(R.id.TV_noDevicesFound);
listView=findViewById(R.id.deviceList);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
字符串设备_SSID=listView.getItemAtPosition(位置).toString();
连接到设备(设备\ SSID);
Intent Intent=新Intent(选择device.this,选择sewifi.class);
星触觉(意向);
}
});
wifiManager=(wifiManager)getApplicationContext().getSystemService(Context.WIFI_服务);
如果(!wifiManager.isWifiEnabled()){
wifiManager.setWifiEnabled(true);
}
adapter=new ArrayAdapter(此,R.layout.layout_列表_项,R.id.DeviceTextView,arrayList);
setAdapter(适配器);
}
私有void connectToDevice(字符串SSID){
WifiInfo连接;
Log.d(“连接到SSID:,SSID”);
WifiConfiguration conf=新的WifiConfiguration();
conf.SSID=“\”“+SSID+”\”;
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wifiManager=(wifiManager)getApplicationContext().getSystemService(Context.WIFI_服务);
int netID=wifiManager.addNetwork(conf);
Log.d(“netID”和“+netID”);
wifiManager.disconnect();
wifiManager.enableNetwork(netID,true);
wifiManager.reconnect();
connection=wifiManager.getConnectionInfo();
字符串ConnectedSSID=connection.getSSID();
Log.d(“连接到SSID:”,ConnectedSSID);
}
@凌驾
受保护的void onStop(){
super.onStop();
试一试{
未注册接收人(wifiReceiver);
}捕获(最终异常){
Log.d(“接收器尝试捕获”,“无法注销接收器”);
}
}
@凌驾
受保护的void onStart(){
super.onStart();
arrayList.clear();
registerReceiver(wifiReceiver,新的意向过滤器(WifiManager.SCAN\u RESULTS\u AVAILABLE\u ACTION));
wifiManager.startScan();
Toast.makeText(这是“扫描设备…”,Toast.LENGTH_SHORT.show();
}
}
D/连接到SSID::Cessabit-1111
I/zygote:执行部分代码缓存收集,代码=107KB,数据=80KB
I/zygote:在代码缓存收集之后,代码=107KB,数据=80KB
将代码缓存容量增加到512KB
D/netID:-1
V/NativeCrypto:读取错误:ssl=0xec4b4768:系统调用期间发生I/O错误,软件导致连接中止
V/NativeCrypto:写入错误:ssl=0xec4b4768:系统调用期间发生I/O错误,管道断开
V/NativeCrypto:SSL关闭失败:SSL=0xec4b4768:系统调用期间发生I/O错误,成功
D/连接到SSID::
由于API发生了变化,您必须为Android 10及以上版本执行单独的操作
使用WiFineTworksSpecifier发送您的请求。使用onAvailable()中提供的网络对象
private void connectToDevice(字符串SSID){
if(Build.VERSION.SDK_INT 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);
}
};
}
}