Android включает / выключает WiFi HotSpot программно - PullRequest
53 голосов
/ 18 июня 2011

Существует ли API для программного включения / выключения WiFi HotSpot на Android?

Какие методы я должен вызвать, чтобы включить / выключить его?

ОБНОВЛЕНИЕ: Есть эта опция, чтобы включить HotSpot и просто включить / выключить WiFi, но это не хорошее решение для меня.

Ответы [ 12 ]

51 голосов
/ 14 мая 2014

Используйте класс ниже, чтобы изменить / проверить настройку Wifi hotspot:

import android.content.*;
import android.net.wifi.*;
import java.lang.reflect.*;

public class ApManager {

//check whether wifi hotspot on or off
public 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 off
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;
}
} // end of class

Вам необходимо добавить указанные ниже разрешения для вашего 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" />

Используйте этот автономный класс ApManager из любого места следующим образом:

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

Надеюсь, это кому-нибудь поможет

8 голосов
/ 18 июня 2011

В Android SDK нет методов, относящихся к функции точки доступа WiFi - извините!

4 голосов
/ 13 мая 2013

Вы можете использовать следующий код для включения, отключения и запроса программного статуса Wi-Fi direct.

package com.kusmezer.androidhelper.networking;

import java.lang.reflect.Method;
import com.google.common.base.Preconditions;
import android.content.Context;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.util.Log;

public final class WifiApManager {
      private static final int WIFI_AP_STATE_FAILED = 4;
      private final WifiManager mWifiManager;
      private final String TAG = "Wifi Access Manager";
      private Method wifiControlMethod;
      private Method wifiApConfigurationMethod;
      private Method wifiApState;

      public WifiApManager(Context context) throws SecurityException, NoSuchMethodException {
       context = Preconditions.checkNotNull(context);
       mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
       wifiControlMethod = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class,boolean.class);
       wifiApConfigurationMethod = mWifiManager.getClass().getMethod("getWifiApConfiguration",null);
       wifiApState = mWifiManager.getClass().getMethod("getWifiApState");
      }   
      public boolean setWifiApState(WifiConfiguration config, boolean enabled) {
       config = Preconditions.checkNotNull(config);
       try {
        if (enabled) {
            mWifiManager.setWifiEnabled(!enabled);
        }
        return (Boolean) wifiControlMethod.invoke(mWifiManager, config, enabled);
       } catch (Exception e) {
        Log.e(TAG, "", e);
        return false;
       }
      }
      public WifiConfiguration getWifiApConfiguration()
      {
          try{
              return (WifiConfiguration)wifiApConfigurationMethod.invoke(mWifiManager, null);
          }
          catch(Exception e)
          {
              return null;
          }
      }
      public int getWifiApState() {
       try {
            return (Integer)wifiApState.invoke(mWifiManager);
       } catch (Exception e) {
        Log.e(TAG, "", e);
            return WIFI_AP_STATE_FAILED;
       }
      }
}
3 голосов
/ 25 января 2018

Для Android 8.0 существует новый API для обработки горячих точек. Насколько я знаю, старый способ с использованием отражения больше не работает. Пожалуйста, обратитесь к:

Разработчики Android https://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)

Запросить только локальную точку доступа, которую приложение может использовать для связи между совместно расположенными устройствами, подключенными к созданной точке доступа WiFi. Сеть, созданная этим методом, не будет иметь доступа к Интернету.

Переполнение стека
Как программно включить / выключить точку доступа Wi-Fi в Android 8.0 (Oreo)

Метод onStarted (WifiManager.LocalOnlyHotspotReservation) будет вызываться, если включена горячая точка. Используя ссылку WifiManager.LocalOnlyHotspotReservation, вы вызываете метод close (), чтобы отключить горячую точку.

2 голосов
/ 19 марта 2018

Относится только к Oreo + ...

Я создал приложение с кодом здесь, на GitHub , которое использует отражение и DexMaker для 'получите функциональность привязки 'Oreo, которая теперь находится в ConnectionManager, а не WifiManager.

Материал в WifiManager подходит только для закрытой сети Wi-Fi (что объясняет закрытый бит в именах классов!).

Дополнительные пояснения https://stackoverflow.com/a/49356255/772333.

2 голосов
/ 18 июня 2011

Ваш лучший выбор будет смотреть на класс WifiManager. В частности, функция setWifiEnabled(bool).

См. Документацию по адресу: http://developer.android.com/reference/android/net/wifi/WifiManager.html#setWifiEnabled(boolean)

Учебное пособие по его использованию (включая необходимые разрешения) можно найти здесь: http://www.tutorialforandroid.com/2009/10/turn-off-turn-on-wifi-in-android-using.html

1 голос
/ 16 декабря 2014

Я опубликовал неофициальные API для того же, он содержит больше, чем просто поворот горячей точки on/off. ссылка

Для DOC API - ссылка .

1 голос
/ 18 февраля 2014

Это хорошо работает для меня:

WifiConfiguration apConfig = null;
Method method = wifimanager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
method.invoke(wifimanager, apConfig, true);
0 голосов
/ 11 июля 2019

Вы можете использовать консоль и сервис для этой опции.

Я думаю, что с этим вы можете решить это.Я сделал тест непосредственно в консоли и включил точку доступа

Я нашел это в этой статье Можно ли подключить USB-устройство к Android с помощью adb через терминал?

Ипосле прочтения интерфейса мы можем использовать те же 24, но нам нужно больше параметров

подключение вызова службы 24 i32 0 i32 1 i32 0 s16 random

0 голосов
/ 08 апреля 2019

Мы можем программно включать и выключать

setWifiApDisable.invoke(connectivityManager, TETHERING_WIFI);//Have to disable to enable
setwifiApEnabled.invoke(connectivityManager, TETHERING_WIFI, false, mSystemCallback,null);

Используя класс обратного вызова, чтобы программно включить горячую точку в режиме пирога (9.0), вам нужно программно выключить и включить.

...