7

Quando ho provato ad abilitare il tethering wifi dal seguente codice che genera l'eccezioneAndroid 6.0.1 non poteva consentire WiFi Hotspot programmazione

java.lang.reflect.InvocationTargetException a java.lang.reflect.Method .invoke (Native Method) in com .....

.... non è stato concesso questa autorizzazione: android.permission.WRITE_SETTINGS

Ma questo funziona bene in Android 6.0 e versioni di seguito. E anche provato a dare android.permission.WRITE_SETTINGS troppo.

Esiste qualche limitazione nell'accesso a wifiAP in Android 6.1?

Seguire ho allegato il codice di esempio che ho utilizzato per abilitare hotspot.

  WifiConfiguration netConfig = new WifiConfiguration(); 
      netConfig.SSID = ssId; 
      netConfig.preSharedKey = passkey; 
      netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); 
      netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 

      try { 
       boolean apstatus = (Boolean) method.invoke(wifiManager, netConfig, true); 

       for (Method isWifiApEnabledmethod : wmMethods) { 
        if (isWifiApEnabledmethod.getName().equals("isWifiApEnabled")) { 
         while (!(Boolean) isWifiApEnabledmethod.invoke(wifiManager)) {} 

         for (Method method1 : wmMethods) { 
          if (method1.getName().equals("getWifiApState")) { 
           int apstate; 
           apstate = (Integer) method1.invoke(wifiManager); 
           Log.i(TAG, "Apstate ::: " + apstate); 
          } 
         } 
        } 
       } 

       if (apstatus) { 
        Log.d(TAG, "Access Point created"); 
       } else { 
        Log.d(TAG, "Access Point creation failed"); 
       } 

      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } catch (InvocationTargetException e) { 
       e.printStackTrace(); 
      } 

risposta

2

Questo non è il way.but corretto che venga risolta la questione.

Modificata la versione di sdk di destinazione su 21. Quindi l'hotspot verrà avviato a livello di codice anche in Android 6.0.1. Credo che ci dovrebbe essere un modo corretto per farlo per Android 6 e versioni successive. Penso che richiedere le autorizzazioni di runtime abbia bisogno di eseguire quel tipo di processess. This talks about the android permission requesting in runtime

+0

che dovevo fare qualcosa di simile per la scansione Bluetooth, impostare l'SDK di destinazione un po 'indietro ed emula il vecchio funzionalità, e non ti ingombrano con la nuovo modo di fare le cose. – stu

2

Penso che Android M non supporti la creazione di hotspot a livello di codice. Puoi portare il tuo utente Marshmallow alla pagina delle impostazioni per creare l'hotspot da solo. sotto il codice ti aiuterò ad andare alla pagina di impostazione.

startActivity(
    new Intent(Settings.ACTION_SETTINGS)); 
+0

Perché pensi "Pensa". Hai qualcosa che supporti questo? Perché sto cercando di attivare l'hotspot in M. Ho creato Hotspot ma non sono in grado di abilitarlo. Ottenere 'Eccezione in softap start java.lang.IllegalStateException: comando '2707 softap set wlan0' –

2

obiettivo fissato SDK versione 21 e chiedere il permesso write_settings nella vostra attività. Aggiungi anche l'autorizzazione android.permission.WRITE_SETTINGS in manifest.

if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.WRITE_SETTINGS)){ 

}else { 
    ActivityCompat.requestPermissions(this, 
      new String[]{Manifest.permission.WRITE_SETTINGS}, 
      121); 
} 

Per maggiori informazioni si prega di visitare http://developer.android.com/training/permissions/requesting.html

0

Ragazzi ho provato di tutto e non ero in grado di avviare l'hotspot in Android 6.0. Puoi controllare se Api è> = 23, e se è così basta portare l'utente alla pagina delle impostazioni per creare l'hotspot da solo.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    final Intent intent = new Intent(Intent.ACTION_MAIN, null); 
    intent.addCategory(Intent.CATEGORY_LAUNCHER); 
    final ComponentName cn = new ComponentName(
        "com.android.settings", 
        "com.android.settings.TetherSettings"); 
    intent.setComponent(cn); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
}else{ 
    createhotSpot(); 
} 
+0

Ho scritto un'app che attiva l'hotspot wifi in base ai servizi di localizzazione (quindi, ad esempio, continua quando sono a casa) il L'intero punto di programmazione è quello di automatizzare le cose in modo che l'utente non debba fare nulla.Qualche modifica di google ha annullato la funzionalità? – stu

+1

@stu Ho implementato questa applicazione e non sono riuscito a trovare un modo per avviare il wifi senza l'interazione dell'utente. E sì programmazione dopo tutto è un significato per l'automatizzazione senza interazione dell'utente, ma Google sta dettando il gioco qui;) – Alexander

0

L'autorizzazione non è un problema. Hai bisogno di qualcosa di simile a questo codice:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
if (!Settings.System.canWrite(getApplicationContext())) { 
    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName())); 
    startActivityForResult(intent, 200); //You need a callback for activity result so that check if user enabled this feature, go for starting hotspot (google for it) 
} else { 
    // Do your stuff about starting hotspot (in network thread) 
} 

}