【问题标题】:How to get WifiManger working in API 29 Android如何让 WifiManger 在 API 29 Android 中工作
【发布时间】:2019-08-09 01:54:39
【问题描述】:

在使用 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 wifimanager


【解决方案1】:

由于 API 发生了变化,您必须为 Android 10 及更高版本执行单独的操作。

使用 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);

【讨论】:

  • 此代码对我不起作用。安卓 10 一加 7T。授权窗口出现了良好的 ssid,但是当我点击连接时,连接过程开始“获取地址 ip”,然后吐司“连接成功”,授权弹出窗口再次返回...
  • 我在装有 Android 10 的 OnePlust 6T 上遇到了同样的问题。我得到一个连接到正确网络的弹出窗口,然后得到相同的“成功连接”,并且再次弹出相同的弹出窗口。这就像一个循环......
  • 你是否使用了给定 onAvailable() 回调的网络对象?
  • 同样的事情发生在我身上。有什么解决办法吗?
  • 我收到您的代码错误:请求不是来自前台应用程序或服务。拒绝来自 的请求。我在 Android 10 中使用 Wifi 广播接收器。
猜你喜欢
  • 1970-01-01
  • 2020-08-14
  • 2014-01-16
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多