2015-12-15 12 views
5

Ho richiesto il permesso in Android versione 6.0 - Marshmallow, ma restituisce ancora l'elenco vuoto quando si utilizza getScanResults().bug di Android 6.0? Avere il permesso ma getScanResults() restituisce ancora l'elenco vuoto in Android 6.0

private boolean checkPermission() { 

    List<String> permissionsList = new ArrayList<String>(); 

    if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     permissionsList.add(Manifest.permission.ACCESS_FINE_LOCATION); 
    } 
    if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     permissionsList.add(Manifest.permission.ACCESS_COARSE_LOCATION); 
    } 

    if (permissionsList.size() > 0) { 
     ActivityCompat.requestPermissions((Activity) mContext, permissionsList.toArray(new String[permissionsList.size()]), 
       REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); 
     return false; 
    } 
    return true; 
} 

Dopo richiesta l'autorizzazione, poi nel metodo onRequestPermissionsResult, devo ottenere il permesso di ACCESS_FINE_LOCATION e ACCESS_COARSE_LOCATION, ma non riesco ancora il risultato della scansione

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, 
             int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: 
      if (permissions.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED || 
        (permissions.length == 2 && grantResults[0] == PackageManager.PERMISSION_GRANTED && 
          grantResults[1] == PackageManager.PERMISSION_GRANTED)){ 
       List<ScanResult> scanResults = mWifi.getScanResults(); 
       //list is still empty 
      } 
      else { 
       // Permission Denied 
       Toast.makeText(mContext, getString(R.string.permission_deny), Toast.LENGTH_LONG).show(); 
      } 
      break; 
    } 
} 

Questo è un bug di M Android?

+1

hai chiamato 'mWifi.startScan();'? –

+0

sì, ho chiamato startScan() in onResume: – shaotine

+0

Hai aspettato la trasmissione [SCAN_RESULTS_AVAILABLE_ACTION] (http://developer.android.com/reference/android/net/wifi/WifiManager.html#SCAN_RESULTS_AVAILABLE_ACTION)? –

risposta

6

È ancora necessario abilitare WIFI dopo aver richiesto l'autorizzazione. Così, in breve, si deve fare questo in sequenza per la scansione del perimetro:

  1. Richiedere le autorizzazioni necessarie (ACCESS_WIFI_STATE, CHANGE_WIFI_STATE, ACCESS_COARSE_LOCATION). Inoltre, su MM devi richiederlo in fase di esecuzione, come hai affermato.
  2. Abilita WIFI con WifiManager # setWifiEnabled (true);
  3. È non necessario abilitare l'accesso alla posizione programatically che so fuori. Leggere la nota sotto.
  4. si deve registrare un BrodcastReceiver per SCAN_RESULTS_AVAILABLE_ACTION. È qui che si ottiene il segnale che le scansioni sono pronte .. Non importa se ti registri tramite AndroidManifest o dinamicamente in fase di esecuzione, a patto che sia fatto prima del prossimo passaggio.
  5. Devi WifiManager # startScan() per richiedere esattamente l'aggiornamento ONE per le scansioni di rete. Se si vuole di più, impostare una temporizzatore/TimerTask (consigliato) o riprogrammare quando si riceve la precedente (che potrebbe mai)
  6. Solo sulla BroadcastReceiver OnReceive si sarà in grado di chiamare WifiManager # getScanResults() con risultati plausibili.

Nota: Su alcuni telefoni (Moto X 2014), ho notato è necessario posizione di base ha consentito per ottenere alcun risultato, che solo l'utente (interfaccia utente del sistema) sembra essere in grado di fare di attivazione on/off. Se l'utente ha una posizione completamente disattivata, non riesco a ottenere un elenco di risultati non vuoto, , anche se l'interfaccia utente del sistema può. Ciò è probabilmente dovuto al fatto che Marshmallow deve avere una posizione per le scansioni Bluetooth e WiFi nelle app degli utenti e una cattiva implementazione da parte di Motorola o un difetto già corretto nell'ultimo tracker Marshmallow ma non nell'ultima OTA di Motorola, perché ciò non avviene un Nexus 5 o un Galaxy S6.

+0

Non ho trovato nulla nei documenti sulla necessità di un permesso ACCESS_WIFI_STATE. È menzionato da qualche parte? – stoefln

+0

probabilmente no. L'ho aggiunto per buona misura, ma CHANGE_WIFI_STATE probabilmente viene fornito con la precedente autorizzazione allegata dalla gerarchia – leRobot

+0

CHANGE_WIFI_STATE non è menzionato né nei documenti. E in realtà non è nemmeno necessario quando l'utente attiva la sua connessione wifi manualmente. IMO la tua risposta dovrebbe menzionare anche questo fatto. – stoefln

1

Forse è causa con la gestione dei permessi di esecuzione Android di M, è possibile impostare targetSdkVersion 19 (meno di 21 o 23) per riprovare. Funziona per me

+0

Sì, cambio da 23 a 22 e funziona. – maatik5

4

su Nexus 5, con l'aggiornamento M, sembra a me ho anche bisogno di avere posizione GPS acceso per ottenere questo lavoro.

0

In Android Marshmallow 6.0.1 vai su Impostazioni> Connessioni e tieni premuto Posizione. Ci clic sul metodo di posizione e vedrete tre opzioni:

  • Alta precisione: utilizza il GPS, Wi-Fi e reti mobili.
  • Risparmio batteria: utilizza reti Wi-Fi e mobili.
  • Solo dispositivo: utilizza il GPS.

risparmio Selezionare batteria al fine di ottenere la connessione Wi-Fi risultati di scansione senza attivare il GPS.

Problemi correlati