Turning on wifi using WifiManager stops to work on Android 10

前端 未结 4 623
轮回少年
轮回少年 2020-11-30 15:14

I have following code which used to work well pre Android 10. But it is not able to turn wifi on in Android 10 devices.

WifiManager wifiMgr = (WifiManager) g         


        
相关标签:
4条回答
  • 2020-11-30 15:47

    public boolean setWifiEnabled (boolean enabled)

    This method was deprecated in API level 29. Starting with Build.VERSION_CODES#Q, applications are not allowed to enable/disable Wi-Fi.

    Compatibility Note: For applications targeting Build.VERSION_CODES.Q or above, this API will always return false and will have no effect.

    If apps are targeting an older SDK ( Build.VERSION_CODES.P or below), they can continue to use this API.

    According to documentation, Apps will not be able to turn Wi-Fi OFF/ON anymore from Android-10 API level 29[Until google provides an alternative solution].

    For more information see official documentation.

    And there is an issue 128554616 has been created in google issuetracker about this.

    0 讨论(0)
  • 2020-11-30 15:51

    I don't know where the problem is, as Google is answering it already:

    If apps are targeting an older SDK ( Build.VERSION_CODES.P or below), they can continue to use this API.

    So change your Target SDK to 28 and it works fine on Android Q.

    Or if you need to change WiFi State by second Apps like Tasker or Automate:

    1. Install Android Studio
    2. Create a new Project namend WiFiOn with Empty Activity and SDK 28
    3. Add commented lines:
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.net.wifi.WifiManager;
    import android.content.Context;
    import android.os.Bundle;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Add WiFi On Part
            WifiManager wifi = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            wifi.setWifiEnabled(true); // true or false to activate/deactivate wifi
    
    
            // Add Toast if you want to
            Toast toast = Toast.makeText(getApplicationContext(), "WiFi on",  Toast.LENGTH_SHORT);
            toast.show();
    
            // Add Close Activity immediatelly
            finish();
    
        }
    }
    
    1. Change minSdkVersion and targetSdkVersion to 28 in build.grade(:app)
        compileSdkVersion 30
        buildToolsVersion "30.0.2"
    
        defaultConfig {
            applicationId "com.stackoverflow.example"
            minSdkVersion 28
            targetSdkVersion 28
            versionCode 1
            versionName "1.0"
    
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }
    
    1. Add Permission to AndroidMAnifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.p1apps.wifion">
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
        <application
            android:allowBackup="true"
    ...
    
    1. Use Android Studio to install it on your phone.

    2. Create a new Project like in 3. and name it WiFiOff and repeat all steps with changed lines in MainActivity:

    ...
            wifi.setWifiEnabled(false); // true or false to activate/deactivate wifi
    ...
            Toast toast = Toast.makeText(getApplicationContext(), "WiFi off",  
    ...
    
    0 讨论(0)
  • 2020-11-30 15:52

    As we are aware that the above mentioned google issue tracker mentions that we do not have a replacement api for the deprecated setWiFiEnabled, I guess we need to look out for alternatives and so I use InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi enable")); or InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi disable")); while running tests to toggle WiFi on devices with API 29 or above.

    0 讨论(0)
  • 2020-11-30 15:54

    You can still use the old API on older devices (see: official documentation), so here is what I do:

    val wifiMgr = this.applicationContext.getSystemService(WIFI_SERVICE) as WifiManager
    val alertDial: AlertDialog.Builder = AlertDialog.Builder(this)
    
    //
    //=============== Start Wi-Fi if needed ====================
    //     Check Wi-Fi state: 1=disabled WIFI_STATE_DISABLED
    if (wifiMgr.wifiState == 1) {
        alertDial.setMessage(R.string.wifi)
            .setCancelable(false)
            .setPositiveButton(R.string.yes) { _, _ ->  // Enable wifi
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    val panelIntent = Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY)
                    startActivityForResult(panelIntent, 0)
                } else {
                    wifiMgr.isWifiEnabled = true
                }
            }
            .setNegativeButton(R.string.no) { _, _ ->   // Disable wifi
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    val panelIntent = Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY)
                    startActivityForResult(panelIntent, 0)
                } else {
                    wifiMgr.isWifiEnabled = false
                }
            }
        alertDial.show()
        }
    }
    

    The "wifiMgr.isWifiEnabled" is marked as deprecated, but still works on older devices.

    0 讨论(0)
提交回复
热议问题