Android включает / выключает WiFi HotSpot программно

Есть ли API для программного включения / выключения Wi-Fi HotSpot на Android?

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

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

53
задан mxg 18 May 2016 в 19:25
поделиться

1 ответ

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

РЕШЕНИЕ ДЛЯ API < 26:

Для устройств < API 26. Нет никакого общедоступного API Android с этой целью. Так, для работы с теми API, необходимо получить доступ к частным API до [1 133] отражение . Не рекомендуется, но если Вы не имеете никакие другие опции в запасе, затем вот прием.

, В первую очередь, у Вас должно быть это разрешение в Вашей декларации,

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

  <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"/>

Вот то, как можно спросить это относительно времени выполнения:

 private boolean showWritePermissionSettings() {    
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M  
    && Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { 
  if (!Settings.System.canWrite(this)) {    
    Log.v("DANG", " " + !Settings.System.canWrite(this));   
    Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS); 
    intent.setData(Uri.parse("package:" + this.getPackageName()));  
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    this.startActivity(intent); 
    return false;   
  } 
}   
return true; //Permission already given 
}

можно затем получить доступ setWifiEnabled метод посредством отражения. Это возвращает true, если действие, которое Вы попросили, является процессом правильно т.е. позволяет/запрещает горячую точку.

     public boolean setWifiEnabled(WifiConfiguration wifiConfig, boolean enabled) { 
 WifiManager wifiManager;
try {   
  if (enabled) { //disables wifi hotspot if it's already enabled    
    wifiManager.setWifiEnabled(false);  
  } 

   Method method = wifiManager.getClass()   
      .getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);   
  return (Boolean) method.invoke(wifiManager, wifiConfig, enabled); 
} catch (Exception e) { 
  Log.e(this.getClass().toString(), "", e); 
  return false; 
}   
}

можно также получить wificonfiguration горячей точки посредством отражения. Я имею , ответил что метод для этого вопроса на StackOverflow.

P.S.: Если Вы не хотите включать горячую точку программно, можно запустить этот намерение и открыть экран настроек Wi-Fi для пользователя для включения ее вручную.

РЕШЕНИЕ ДЛЯ API> = 26:

Наконец, андроид выпустил официальный API для версий> = Oreo. Можно просто использовать общественность, подвергнутую API андроидом т.е. startLocalOnlyHotspot

, Это включает локальную горячую точку без доступа в Интернет. Который таким образом может использоваться для хостинга файлов передачи или сервера.

Это требует Manifest.permission.CHANGE_WIFI_STATE и ACCESS_FINE_LOCATION полномочия.

Вот простой пример того, как можно включить горячую точку с помощью этого API.

private WifiManager wifiManager;
WifiConfiguration currentConfig;
WifiManager.LocalOnlyHotspotReservation hotspotReservation;

метод для включения горячей точки:

@RequiresApi(api = Build.VERSION_CODES.O)
public void turnOnHotspot() {

      wifiManager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() {

        @Override
        public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) {
          super.onStarted(reservation);
          hotspotReservation = reservation;
          currentConfig = hotspotReservation.getWifiConfiguration();

          Log.v("DANG", "THE PASSWORD IS: "
              + currentConfig.preSharedKey
              + " \n SSID is : "
              + currentConfig.SSID);

          hotspotDetailsDialog();

        }

        @Override
        public void onStopped() {
          super.onStopped();
          Log.v("DANG", "Local Hotspot Stopped");
        }

        @Override
        public void onFailed(int reason) {
          super.onFailed(reason);
          Log.v("DANG", "Local Hotspot failed to start");
        }
      }, new Handler());
    }
`

Вот то, как можно получить детали локально созданной горячей точки

private void hotspotDetaisDialog()
{

    Log.v(TAG, context.getString(R.string.hotspot_details_message) + "\n" + context.getString(
              R.string.hotspot_ssid_label) + " " + currentConfig.SSID + "\n" + context.getString(
              R.string.hotspot_pass_label) + " " + currentConfig.preSharedKey);

}

, Если она бросает, исключение безопасности даже после предоставления необходимых полномочий затем, необходимо попытаться включить местоположение с помощью GPS. Вот решение .

Недавно, я разработал демонстрационное приложение, названное Spotserve. Это включает точку доступа Wi-Fi для всех устройств с API> =15 и размещает демонстрационный сервер на той горячей точке. Можно проверить это на большее количество деталей.Надеюсь, это поможет!

0
ответ дан 7 November 2019 в 08:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: