如何让WifiManger在API 29 Android中工作

如何让WifiManger在API 29 Android中工作,android,wifimanager,Android,Wifimanager,在使用wifi管理器连接Esp8266时,我突然收到一个连接错误。输出说明了一切。我可以扫描并找到正确的SSID,但当连接到它时,连接被拒绝或无法连接。查看文档,wifi manager似乎即将推出?那么WifiNetworkSpecifier应该使用什么呢?但这只适用于使用API29及以上的手机。我需要这个在所有手机上工作 我已从电脑连接到esp8266,并收到回复-esp8266没有连接问题 public class ChooseDevice extends AppCompatActivit

在使用wifi管理器连接Esp8266时,我突然收到一个连接错误。输出说明了一切。我可以扫描并找到正确的SSID,但当连接到它时,连接被拒绝或无法连接。查看文档,wifi manager似乎即将推出?那么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>
公共类选择设备扩展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);
            }
        };
       }

}