Android turn On/Off WiFi HotSpot programmatically Android turn On/Off WiFi HotSpot programmatically android android

Android turn On/Off WiFi HotSpot programmatically


Warning This method will not work beyond 5.0, it was a quite dated entry.

Use the class below to change/check the Wifi hotspot setting:

import android.content.*;import android.net.wifi.*;import java.lang.reflect.*;public class ApManager {//check whether wifi hotspot on or offpublic static boolean isApOn(Context context) {    WifiManager wifimanager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);         try {        Method method = wifimanager.getClass().getDeclaredMethod("isWifiApEnabled");        method.setAccessible(true);        return (Boolean) method.invoke(wifimanager);    }    catch (Throwable ignored) {}    return false;}// toggle wifi hotspot on or offpublic static boolean configApState(Context context) {    WifiManager wifimanager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);    WifiConfiguration wificonfiguration = null;    try {          // if WiFi is on, turn it off        if(isApOn(context)) {                           wifimanager.setWifiEnabled(false);        }                       Method method = wifimanager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);                           method.invoke(wifimanager, wificonfiguration, !isApOn(context));        return true;    }     catch (Exception e) {        e.printStackTrace();    }           return false;}} // end of class

You need to add the permissions below to your AndroidMainfest:

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

Use this standalone ApManager class from anywhere as follows:

ApManager.isApOn(YourActivity.this); // check Ap state :booleanApManager.configApState(YourActivity.this); // change Ap state :boolean

Hope this will help someone


Here's the complete solution if you want to implement the wifi hotspot feature programmatically in your android app.

SOLUTION FOR API < 26:

For devices < API 26. There is no public API by Android for this purpose. So, in order to work with those APIs you've to access private APIs through reflection. It is not recommended but if you've no other options left, then here's a trick.

First of all, you need to have this permission in your manifest,

  <uses-permission    android:name="android.permission.WRITE_SETTINGS"    tools:ignore="ProtectedPermissions"/>  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

Here's how you can ask it on run-time:

 private boolean showWritePermissionSettings() {    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M      && Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {   if (!Settings.System.canWrite(this)) {        Log.v("DANG", " " + !Settings.System.canWrite(this));       Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);     intent.setData(Uri.parse("package:" + this.getPackageName()));      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);     this.startActivity(intent);     return false;     } }   return true; //Permission already given }

You can then access the setWifiEnabled method through reflection. This returns true if the action you asked for is being process correctly i.e. enabling/disabling hotspot.

     public boolean setWifiEnabled(WifiConfiguration wifiConfig, boolean enabled) {  WifiManager wifiManager;try {     if (enabled) { //disables wifi hotspot if it's already enabled        wifiManager.setWifiEnabled(false);    }    Method method = wifiManager.getClass()         .getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);     return (Boolean) method.invoke(wifiManager, wifiConfig, enabled); } catch (Exception e) {   Log.e(this.getClass().toString(), "", e);   return false; }   }

You can also get the wificonfiguration of your hotspot through reflection. I've answered that method for this question on StackOverflow.

P.S: If you don't want to turn on hotspot programmatically, you can start this intent and open the wifi settings screen for user to turn it on manually.

SOLUTION FOR API >= 26:

Finally, android released an official API for versions >= Oreo. You can just use the public exposed API by android i.e. startLocalOnlyHotspot

It turns on a local hotspot without internet access. Which thus can be used to host a server or transfer files.

It requires Manifest.permission.CHANGE_WIFI_STATE and ACCESS_FINE_LOCATION permissions.

Here's a simple example of how you can turn on hotspot using this API.

private WifiManager wifiManager;WifiConfiguration currentConfig;WifiManager.LocalOnlyHotspotReservation hotspotReservation;

The method to turn on hotspot:

@RequiresApi(api = Build.VERSION_CODES.O)public void turnOnHotspot() {      wifiManager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() {        @Override        public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) {          super.onStarted(reservation);          hotspotReservation = reservation;          currentConfig = hotspotReservation.getWifiConfiguration();          Log.v("DANG", "THE PASSWORD IS: "              + currentConfig.preSharedKey              + " \n SSID is : "              + currentConfig.SSID);          hotspotDetailsDialog();        }        @Override        public void onStopped() {          super.onStopped();          Log.v("DANG", "Local Hotspot Stopped");        }        @Override        public void onFailed(int reason) {          super.onFailed(reason);          Log.v("DANG", "Local Hotspot failed to start");        }      }, new Handler());    }`

Here's how you can get details of the locally created hotspot

private void hotspotDetaisDialog(){    Log.v(TAG, context.getString(R.string.hotspot_details_message) + "\n" + context.getString(              R.string.hotspot_ssid_label) + " " + currentConfig.SSID + "\n" + context.getString(              R.string.hotspot_pass_label) + " " + currentConfig.preSharedKey);}

If it throws, a security exception even after giving the required permissions then you should try enabling your location using GPS. Here's the solution.

Recently, I've developed a demo app called Spotserve. That turns on wifi hotspot for all devices with API>=15 and hosts a demo server on that hotspot. You can check that for more details. Hope this helps!


For Android 8.0, there is a new API to handle Hotspots. As far as I know, the old way using reflection doesn't work anymore.Please refer to:

Android Developershttps://developer.android.com/reference/android/net/wifi/WifiManager.html#startLocalOnlyHotspot(android.net.wifi.WifiManager.LocalOnlyHotspotCallback,%20android.os.Handler)

void startLocalOnlyHotspot (WifiManager.LocalOnlyHotspotCallback callback,                 Handler handler)

Request a local only hotspot that an application can use to communicate between co-located devices connected to the created WiFi hotspot. The network created by this method will not have Internet access.

Stack Overflow
How to turn on/off wifi hotspot programmatically in Android 8.0 (Oreo)

onStarted(WifiManager.LocalOnlyHotspotReservation reservation) method will be called if hotspot is turned on.. Using WifiManager.LocalOnlyHotspotReservation reference you call close() method to turn off hotspot.