Android 7.1 не удалось включить точку доступа Wi-Fi программно - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь открыть точку доступа Wi-Fi в android. Когда я запускаю нижеприведенный код, он успешно работает для Api 28, я могу открыть точку доступа Wi-Fi без ошибок, но при запуске в Api 25 для устройства Android 7.1 он получает ниже ошибок, он говорит, что получить разрешение WRITE_SETTINGS, но когда я тестировал для Api 28, это не обязательно для запуска приложения, почему я могу получить эту ошибку и как я могу запустить его для android Api 25

Получение ошибок

W/System.err: java.lang.NoSuchMethodException: setWifiApEnabled  [class android.net.wifi.WifiConfiguration, boolean]
        at java.lang.Class.getMethod(Class.java:1981)
        at java.lang.Class.getMethod(Class.java:1637)
        at com.kocsistem.pixageoneandroid.utils.Utils.configApState(Utils.java:1126)
        at com.kocsistem.pixageoneandroid.utils.Utils.openHotspot(Utils.java:1095)
        at com.kocsistem.pixageoneandroid.network.broadcast.NetworkChangeReceiver$2.run(NetworkChangeReceiver.java:120)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

Открыть код Hotspot

public static void openHotspot(Context context,boolean enable){
    WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        assert manager != null;
        try {
            manager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() {

                @SuppressLint("SetTextI18n")
                @Override
                public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) {
                    super.onStarted(reservation);
                    Log.i("Wifi Hotspot is on now , reservation is : %s", reservation.toString());
                    mReservation = reservation;
                    WifiManager.LocalOnlyHotspotReservation mReservation = reservation;
                    String key = mReservation.getWifiConfiguration().preSharedKey;
                    Log.i("key:",key);
                    String ussid = mReservation.getWifiConfiguration().SSID;
                    Log.i("ussid:",ussid);
                }

                @Override
                public void onStopped() {
                    super.onStopped();
                    Log.i("onStopped: ","");
                }

                @Override
                public void onFailed(int reason) {
                    super.onFailed(reason);
                    Log.i("onFailed: ","");
                }
            }, new Handler());
        }catch (Exception e){
            e.printStackTrace();
        }
    }else{
      //for Api<26
        configApState(context);
    }
}

проверить, включена или отключена точка доступа Wi-Fi

public static boolean isApOn(Context context) {
    WifiManager wifimanager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
    try {
        Method method = wifimanager.getClass().getDeclaredMethod("isWifiAp Enabled");
        method.setAccessible(true);
        return (Boolean) method.invoke(wifimanager);
    }
    catch (Throwable ignored) {}
    return false;
}

включить или выключить точку доступа Wi-Fi

    public 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;
    }
...