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);
After you are done using the Wifi access point do
connectivityManager.unregisterNetworkCallback(networkCallback);
From Google's Issue tracker by Google's Engineer:
The network suggestions API flow requires the user to approve the app (platform posts a notification to ask user for approval). Once the app is approved, the platform will consider all networks from the app in future auto-connection attempts. But, this API does not give you guarantees on when the device will connect to your AP for provisioning. So, WifiNetworkSuggestion is not the right API surface for the provided use-case (peer to peer instant connectivity).
Using WifiNetworkSpecifier establishes a local connection to the wifi access point as mentioned above. The default network will still be cellular in this case (we don't disrupt other app's internet connectivity). The app making the request should use the multi-network API's to route their traffic over the established connection. The |Network| object provided in the onAvailable() callback for the request is the handle that app needs to use for opening sockets over that local network (Look at https://developer.android.com/reference/android/net/Network.html#bindSocket(java.net.DatagramSocket) and other such API's available in the |Network| object surface.
Hope this helps.
–
–
–
As stated here, Android 10 made it intentionally so that the WifiNetworkSpecifier prevents actual internet connectivity. It is meant for peer to peer connections.
The WifiNetworkSuggestion API, however, provides internet connectivity and behaves similarly to the WifiNetworkSpecifier API. As long as the device is not currently connected to any Wifi network, the WifiNetworkSuggestion API will automatically connect to the specified network. The first time a device uses it, a notification will appear asking if the app can suggest networks. The user must accept this notification for the WifiNetworkSuggestion API to work.
I found that Android's provided code in the WifiNetworkSuggestion documentation had a few compile errors. Here is the code that I found to work:
final WifiNetworkSuggestion suggestion1 = new WifiNetworkSuggestion.Builder()
.setSsid("SSID here")
.setWpa2Passphrase("password here")
.setIsAppInteractionRequired(true) // Optional (Needs location permission)
.build();
// Optional extra suggesstion, you can delete this or add more
final WifiNetworkSuggestion suggestion2 = new WifiNetworkSuggestion.Builder()
.setSsid("SSID here 2")
.setWpa2Passphrase("password here 2")
.setIsAppInteractionRequired(true) // Optional (Needs location permission)
.build();
final List<WifiNetworkSuggestion> suggestionsList = new ArrayList<WifiNetworkSuggestion>();
suggestionsList.add(suggestion1);
suggestionsList.add(suggestion2); // Optional extra suggestion
final WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
final int status = wifiManager.addNetworkSuggestions(suggestionsList);
if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
// Error handling
final IntentFilter intentFilter = new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);
final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override public void onReceive(Context context, Intent intent) {
if (!intent.getAction().equals(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {
return;
// Post connection
getApplicationContext().registerReceiver(broadcastReceiver, intentFilter);
–
–
You should use Wi-Fi network suggestion API in Q
final WifiNetworkSuggestion suggestion1 =
new WifiNetworkSuggestion.Builder()
.setSsid("test111111")
.setIsAppInteractionRequired() // Optional (Needs location permission)
.build()
final WifiNetworkSuggestion suggestion2 =
new WifiNetworkSuggestion.Builder()
.setSsid("test222222")
.setWpa2Passphrase("test123456")
.setIsAppInteractionRequired() // Optional (Needs location permission)
.build()
final WifiNetworkSuggestion suggestion3 =
new WifiNetworkSuggestion.Builder()
.setSsid("test333333")
.setWpa3Passphrase("test6789")
.setIsAppInteractionRequired() // Optional (Needs location permission)
.build()
final List<WifiNetworkSuggestion> suggestionsList =
new ArrayList<WifiNetworkSuggestion> {{
add(suggestion1);
add(suggestion2);
add(suggestion3);
final WifiManager wifiManager =
(WifiManager) context.getSystemService(Context.WIFI_SERVICE);
final int status = wifiManager.addNetworkSuggestions(suggestionsList);
if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
// do error handling here…
// Optional (Wait for post connection broadcast to one of your suggestions)
final IntentFilter intentFilter =
new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);
final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (!intent.getAction().equals(
WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {
return;
// do post connect processing here..
context.registerReceiver(broadcastReceiver, intentFilter);
–
–
Inside the onAvailable(Network)
callback on ConnectivityManager.NetworkCallback()
(after you setup your WifiNetworkSpecifier.Builder()
and NetworkRequest.Builder()
), call ConnectivityManager.bindProcessNetwork
to direct your traffic on the connected network, as documented in the Network
API: https://developer.android.com/reference/android/net/Network
Identifies a Network. This is supplied to applications via ConnectivityManager.NetworkCallback in response to the active ConnectivityManager#requestNetwork or passive ConnectivityManager#registerNetworkCallback calls. It is used to direct traffic to the given Network, either on a Socket basis through a targeted SocketFactory or process-wide via ConnectivityManager#bindProcessToNetwork.
private inner class MyCallback : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
// Call this method once this callback is triggered after
// your call to mConnectivityManager.requestNetwork()
mConnectivityManager.bindProcessToNetwork(network)
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.