Changing Android hotspot settings
Asked Answered
T

1

5

With the release of API level 26, my app's core functionality broke, this being, changing the users' hotspot setting within the application. To get and set this configuration I am using the following functions from the WifiManager hidden api: getWifiApConfiguration and setWifiApConfiguration.

Method getWifiApConfiguration = wifiManager.getClass().getMethod("getWifiApConfiguration");
getWifiApConfiguration.invoke(wifiManager);

This is working with devices prior to Android O, but in this version I get the following error:

App not allowed to read or update stored WiFi Ap config (uid = 10168)

The permissions I have declared in the manifest are:

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<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"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.NETWORK_STACK"/>
<uses-permission android:name="android.permission.TETHER_PRIVILEGED" />

How can I do this with the latest APIs?

Thorax answered 24/9, 2017 at 16:27 Comment(1)
Hey, did you ever find a way around this? Were you at least able to persist the configs android automatically generating?Aden
O
14

As of Android Oreo (26), a new permission check was added to the service implementation of the getWifiApConfiguration() method:

Snippet from WifiServiceImpl.java

/**
 * see {@link WifiManager#getWifiApConfiguration()}
 * @return soft access point configuration
 * @throws SecurityException if the caller does not have permission to retrieve the softap
 * config
 */
@Override
public WifiConfiguration getWifiApConfiguration() {
    enforceAccessPermission();
    int uid = Binder.getCallingUid();
    // only allow Settings UI to get the saved SoftApConfig
    if (!mWifiPermissionsUtil.checkConfigOverridePermission(uid)) {
        // random apps should not be allowed to read the user specified config
        throw new SecurityException("App not allowed to read or update stored WiFi Ap config "
                + "(uid = " + uid + ")");
    }
    mLog.trace("getWifiApConfiguration uid=%").c(uid).flush();
    return mWifiStateMachine.syncGetWifiApConfiguration();
}

Digging into the code you will quickly find out that to successfully invoke this method your application must hold the android.permission.OVERRIDE_WIFI_CONFIG permission that is a system level protected permission:

Snippet from framework AndroidManifest.xml

<!-- @SystemApi @hide Allows an application to modify any wifi configuration, even if created
 by another application. Once reconfigured the original creator cannot make any further
 modifications.
 <p>Not for use by third-party applications. -->
<permission android:name="android.permission.OVERRIDE_WIFI_CONFIG"
    android:protectionLevel="signature|privileged" />

This means that your application needs to be signed by the platform key or be privileged to use this API.

Obturate answered 24/9, 2017 at 18:18 Comment(2)
It's possible ask for this permission on code? What is the request code to ask it? I'm trying to do a modification of Wifi Ap configuration but without this permission it's impossibleVenezuela
Just tried this method on Android 10 and it's not working.Cartwright

© 2022 - 2024 — McMap. All rights reserved.