2017-08-31 6 views
3

Je sais comment allumer/éteindre le point chaud wifi en utilisant la réflexion dans Android en utilisant la méthode ci-dessous.Comment activer/désactiver le hotspot wifi par programmation sous Android 8.0 (Oreo)

private static boolean changeWifiHotspotState(Context context,boolean enable) { 
     try { 
      WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
      Method method = manager.getClass().getDeclaredMethod("setWifiApEnabled", WifiConfiguration.class, 
        Boolean.TYPE); 
      method.setAccessible(true); 
      WifiConfiguration configuration = enable ? getWifiApConfiguration(manager) : null; 
      boolean isSuccess = (Boolean) method.invoke(manager, configuration, enable); 
      return isSuccess; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return false; 
    } 

Mais la méthode ci-dessus ne fonctionne pas Android 8.0 (Oreo).

Lorsque j'exécute la méthode ci-dessus dans Android 8.0, j'obtiens l'instruction ci-dessous dans logcat.

com.gck.dummy W/WifiManager: com.gck.dummy attempted call to setWifiApEnabled: enabled = true 

est-il un autre moyen de hotspot on/off sur Android 8.0

+0

Voulez-vous désactiver le wifi ou hotspot – MrAppMachine

+0

Je veux activer/désactiver hotspot ... pas le wifi ... – Chandrakanth

+0

est-il possible qu'ils ont supprimé cette façon de le faire dans Android O ? L'activation du hotspot Wi-Fi ne fait pas partie du sdk Android. – Rafa

Répondre

4

Enfin, je suis la solution. Android 8.0, ils ont fourni une API publique pour activer/désactiver hotspot. WifiManager

est sous le code pour activer le hotspot

@RequiresApi(api = Build.VERSION_CODES.O) 
    private void turnOnHotspot(){ 
     WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); 

     manager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback(){ 

      @Override 
      public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) { 
       super.onStarted(reservation); 
       Log.d(TAG, "Wifi Hotspot is on now"); 
      } 

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

      @Override 
      public void onFailed(int reason) { 
       super.onFailed(reason); 
       Log.d(TAG, "onFailed: "); 
      } 
     },new Handler()); 
    } 

méthode onStarted(WifiManager.LocalOnlyHotspotReservation reservation) sera appelée si hotspot est activée .. En utilisant WifiManager.LocalOnlyHotspotReservation référence que vous appelez close() méthode pour désactiver le point d'accès .

Mise à jour: Pour activer le point d'accès, le Location(GPS) doit être activé dans l'appareil. Sinon, il va lancer SecurityException

+0

J'ai cette erreur "java.lang.SecurityException: UID 10103 n'a pas la permission de localisation" bien que j'aie activé l'emplacement dans l'appareil et ajouté les permissions dans le fichier manifeste . Quelles sont les autorisations que vous avez ajoutées? –

+0

@ JeanCreuzédesChâtelliers Selon les docs, l'application doit avoir les permissions CHANGE_WIFI_STATE et ACCESS_COARSE_LOCATION. Et avant d'activer Hotspot, le GPS (emplacement) doit être activé. Assurez-vous que les 2 autorisations mentionnées ci-dessus sont accordées. – Chandrakanth

+0

Oups, désolé. J'ai oublié d'activer la permission ACCESS_COARSE_LOCATION bien que je l'aie ajoutée dans le manifeste. –