Android Q,以编程方式连接到不同的WiFi AP进行互联网连接

Vin*_*odh 6 android android-wifi android-developer-api android-connectivitymanager android-10.0

与Android Q中一样,几个WiFi API也受到限制。我正在尝试使用备用API连接到Internet的不同Wifi AP。

下面是我的代码:

    WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
    builder.setSsid("wifi-ap-ssid");
    builder.setWpa2Passphrase("wifi-ap-password");

    WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();

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

    NetworkRequest nr = networkRequestBuilder1.build();
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    cm.requestNetwork(nr, callback);
Run Code Online (Sandbox Code Playgroud)

这使我可以连接,但互联网已禁用。这正在按照Android文档中的定义运行。

我尝试的替代方法如下:

    WifiNetworkSuggestion.Builder wifiNetworkSuggestionBuilder1 = new WifiNetworkSuggestion.Builder();
    wifiNetworkSuggestionBuilder1.setSsid("wifi-ap-ssid");
    wifiNetworkSuggestionBuilder1.setWpa2Passphrase("wifi-ap-password");
    WifiNetworkSuggestion wifiNetworkSuggestion = wifiNetworkSuggestionBuilder1.build();
    List<WifiNetworkSuggestion> list = new ArrayList<>();
    list.add(wifiNetworkSuggestion);
    wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    wifiManager.removeNetworkSuggestions(new ArrayList<WifiNetworkSuggestion>());
    wifiManager.addNetworkSuggestions(list);
Run Code Online (Sandbox Code Playgroud)

在清单中声明允许:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
Run Code Online (Sandbox Code Playgroud)

使用它并没有改变任何行为。

请告知API序列,以成功连接到具有Internet功能的其他Wifi AP。

Nei*_*ing 9

尝试在 onAvailable() 回调中调用 bindProcessToNetwork() 以重新获得网络连接,它对我来说很好用。

连接到网络:

    WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
    builder.setSsid("wifi-ap-ssid");
    builder.setWpa2Passphrase("wifi-ap-password");

    WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();

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

    NetworkRequest nr = networkRequestBuilder1.build();
    ConnectivityManager cm = (ConnectivityManager)
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
    ConnectivityManager.NetworkCallback networkCallback = new 
        ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            super.onAvailable(network);
            Log.d(TAG, "onAvailable:" + network);
            cm.bindProcessToNetwork(network);
        }
    });
    cm.requestNetwork(nr, networkCallback);
Run Code Online (Sandbox Code Playgroud)

断开绑定网络:

cm.unregisterNetworkCallback(networkCallback);
Run Code Online (Sandbox Code Playgroud)


Ana*_*ara 5

WifiNetworkSuggestion API用于建议用户加入AP(系统会发布通知让用户加入)

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

WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
builder.setSsid("wifi-ap-ssid");
builder.setWpa2Passphrase("wifi-ap-password");

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
                 //Service is an OkHttp interface where we define docs. Please read OkHttp docs
                 Service service = null;

                 OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
                okHttpBuilder.socketFactory(network.getSocketFactory());

                service = new Retrofit.Builder()                                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                        .addConverterFactory(GsonConverterFactory.create(gson))
                         .client(okHttpBuilder.build())
                         .build()
                         .create(Service.class);


               Observable<Object> observable = null;
               try {
                  if (service != null) {
                     observable = service.yourRestCall();
                  }
                  Subscriber<Object> sub = new Subscriber< Object >() {
                     @Override
                     public void onError(Throwable e) {
                        //Do on error
                     }

                     @Override
                     public void onNext(Object logs) {
                        //Do on next
                     }
                  };
                 if(observable != null) {
                     observable.subscribeOn(Schedulers.io())
                                          .observeOn(AndroidSchedulers.mainThread()).subscribe(sub);
                 }

                super.onAvailable(network);
            }
        };
Run Code Online (Sandbox Code Playgroud)

使用完 Wifi 接入点后,执行以下操作

connectivityManager.unregisterNetworkCallback(networkCallback);

来自Google 工程师的Google问题跟踪器:

网络建议 API 流程要求用户批准该应用程序(平台发布通知以请求用户批准)。一旦应用程序获得批准,平台将在未来的自动连接尝试中考虑该应用程序的所有网络。但是,此 API 无法保证设备何时连接到您的 AP 进行配置。因此,WifiNetworkSuggestion 不是所提供用例(点对点即时连接)的正确 API 界面。

如上所述,使用 WifiNetworkSpecifier 建立与 wifi 接入点的本地连接。在这种情况下,默认网络仍然是蜂窝网络(我们不会中断其他应用程序的互联网连接)。发出请求的应用程序应使用多网络 API 通过已建立的连接路由其流量。|网络| 请求的 onAvailable() 回调中提供的对象是应用程序需要用于通过本地网络打开套接字的句柄(请参阅https://developer.android.com/reference/android/net/Network.html#bindSocket (java.net.DatagramSocket)和 |Network| 对象表面中可用的其他此类 API。

希望这可以帮助。


Fun*_*LAM 1

您应该使用Wi-Fi 网络建议 API您应该在 Q 中

\n\n
final WifiNetworkSuggestion suggestion1 =\n  new WifiNetworkSuggestion.Builder()\n  .setSsid("test111111")\n  .setIsAppInteractionRequired() // Optional (Needs location permission)\n  .build()\n\nfinal WifiNetworkSuggestion suggestion2 =\n  new WifiNetworkSuggestion.Builder()\n  .setSsid("test222222")\n  .setWpa2Passphrase("test123456")\n  .setIsAppInteractionRequired() // Optional (Needs location permission)\n  .build()\n\nfinal WifiNetworkSuggestion suggestion3 =\n  new WifiNetworkSuggestion.Builder()\n  .setSsid("test333333")\n  .setWpa3Passphrase("test6789")\n  .setIsAppInteractionRequired() // Optional (Needs location permission)\n  .build()\n\nfinal List<WifiNetworkSuggestion> suggestionsList =\n  new ArrayList<WifiNetworkSuggestion> {{\n    add(suggestion1);\n    add(suggestion2);\n    add(suggestion3);\n  }};\n\nfinal WifiManager wifiManager =\n  (WifiManager) context.getSystemService(Context.WIFI_SERVICE);\n\nfinal int status = wifiManager.addNetworkSuggestions(suggestionsList);\nif (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {\n// do error handling here\xe2\x80\xa6\n}\n\n// Optional (Wait for post connection broadcast to one of your suggestions)\nfinal IntentFilter intentFilter =\n  new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);\n\nfinal BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {\n  @Override\n  public void onReceive(Context context, Intent intent) {\n    if (!intent.getAction().equals(\n      WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {\n      return;\n    }\n    // do post connect processing here..\n  }\n};\ncontext.registerReceiver(broadcastReceiver, intentFilter);\n
Run Code Online (Sandbox Code Playgroud)\n

  • 对我来说, status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS 始终为真。因此我无法让它发挥作用 (3认同)
  • 感谢您的回复。但是,我看到网络建议不提供互联网功能。您对此有其他解决办法吗? (2认同)