Verde
Verde

Reputation: 21

Android wifi state permission

My app is communicating with another device by wifi. I tried to ask all permissions at app's start, but is never asked about wifi. By the way, every time I need to change wifi, user must give permission. How can I ask for change wifi state permission once and never bother user again?

Sample of code that I used to change wifi is below

WifiConfiguration wifiConfig = new WifiConfiguration();
    wifiConfig.SSID = String.format("\"%s\"", ssid);
    if (!key.equals(""))
        wifiConfig.preSharedKey = String.format("\"%s\"", key);

    final int netId = wifiManager.addNetwork(wifiConfig);

    Log.d("Network ID", Integer.toString(netId));
    wifiManager.disconnect();
    wifiManager.enableNetwork(netId, true);
    wifiManager.reconnect();

The permission my phone is asked about below enter image description here

It is Russian. Translation is "Would you give this app a permission to turn on/turn off WIFI?".

I tested it on another phone, and it keeps happening. Both phones is xiaomi and have their own android version MIUI.

Upvotes: 0

Views: 6800

Answers (2)

Selman Tosun
Selman Tosun

Reputation: 438

Add this code snippet in AndroidManifest.xml:

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

And use this code:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(false); // activate/deactivate wifi

Upvotes: 1

Ivan Ardelian
Ivan Ardelian

Reputation: 134

You only need to declare it in AndroidManifest.xml:

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

Android > 6.0 user prompted runtime permission is NOT required for CHANGE_WIFI_STATE, because it is one of the safe ones.

If something is still goes wrong, please provide code sample which you are using.

UPD:

Tested your code on Samsung J5 with Android 6.0 and everithing works fine.

Also you are using deprecated methods. You need to use something like this for >= Android.O

In manifest:

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

And code:

        WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
builder.setSsid("SSID");
builder.setWpa2Passphrase("PASSWORD");

WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();

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

NetworkRequest nr = networkRequestBuilder1.build();
final ConnectivityManager cm = (ConnectivityManager)
        getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager.NetworkCallback networkCallback = new
        ConnectivityManager.NetworkCallback() {
            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void onAvailable(Network network) {
                super.onAvailable(network);
                Log.d("TEST", "onAvailable:" + network);
                cm.bindProcessToNetwork(network);
            }
        };
cm.requestNetwork(nr, networkCallback);

Upvotes: 0

Related Questions