2015-08-22 9 views
37

Gestern erhielt mein Nexus 5 das Update von Android MNC auf Version 6.0 - Marshmallow. Da die Aktion zum Scannen der im Gerät verfügbaren Netzwerke die Liste nicht mehr empfängt, hat die Ergebnisliste in diesem Fall die Größe 0, sogar mit 10+ Wifi-Netzwerken, die in den WLAN-Systemeinstellungen aufgeführt sind.SCAN_RESULTS_AVAILABLE_ACTION leere Liste in Android 6.0 zurück

Der Code dafür ist die übliche: die SCAN_RESULTS_AVAILABLE_ACTION registrieren und für den Fall, in dem Receiver warten, wie folgt aus:

// Register the Receiver in some part os fragment... 
getActivity().registerReceiver(wifiListener, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
WifiManager wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE); 
wifiManager.startScan(); 

// Inside the receiver: 
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
List<ScanResult> results = wifiManager.getScanResults(); 
// the result.size() is 0 after update to Android v6.0, same code working in older devices. 

ich im changes of the API Thema darüber gesucht, aber ich didn‘jede Bruch sehen Änderungen für diese Funktionalität.

Hat das jemand bemerkt? Ist etwas Neues in der API oder nur ein Einzelfall?

+0

Ist Wi-Fi-Scan-Option auf Ihrem N5 aktiviert zulassen? Die Verdächtigen beseitigen. –

+0

In 'Wifi> Erweitert' Ich sehe nur' Network Notification' und 'Keep Wifi ...' Optionen, scheint die Scan-Optionen, die zwischen diesen beiden erscheint in dieser Version verschwunden zu sein. –

+0

Wird beim ersten Zugriff auf diesen Code ein Popup-Dialogfeld angezeigt, um die Berechtigung für Standortdienste zu erteilen? Ich wette auf M, du solltest einen solchen Dialog sehen. Siehe http://developer.android.com/reference/android/app/Activity.html#requestPermissions (java.lang.String [], int) –

Antwort

42

Ab Android 6.0 wurde das Berechtigungsverhalten in Runtime geändert. Um ein Feature zu verwenden, für das eine Berechtigung erforderlich ist, sollte zunächst überprüft werden, ob die Berechtigung zuvor erteilt wurde. Unter Verwendung von checkSelfPermission(permissionString)method wird ein Ergebnis zurückgegeben, dessen Berechtigung PERMISSION_GRANTED oder PERMISSION_DENIED ist.

Wenn die Berechtigung nicht erteilt wird oder es das erste Mal ist, sollte eine Erlaubnisanfrage gestellt werden. Einem Benutzer eine Option zum Gewähren oder Verweigern geben.

Wenn Ihr Code auf dem Gerät vor M ausgeführt wird, fahren Sie mit Ihrem Code fort, die Berechtigung wurde mit der Legacy-Methode erteilt.

Sobald die Berechtigung angefordert wurde, wird dem Benutzer das Dialogfeld angezeigt.Seine/ihre Antwort wird als geliefert werden:

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, 
     int[] grantResults) { 
    if (requestCode == PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION 
      && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
     // Do something with granted permission 
     mWifiListener.getScanningResults(); 
    } 
} 

Danach können Sie überprüfen, ob die Ortungsdienste aktiviert sind, mit LocationServices.SettingsApi und fordern den Benutzer zu ermöglichen, wenn diese Option deaktiviert ist. Dies ist mit Play Services LocationSettingsStatusCodes.RESOLUTION_REQUIRED Rückruf möglich.

+0

Danke! Ich merke, dass dies den Dialog zeigt, wenn die Erlaubnis aus ist, aber um zu aktivieren, denke ich, dass ich Play-Dienste aufrufen muss und die Option anzeigen muss, um den Standort zu aktivieren. –

+1

IMHO, überprüfen, ob Standort und WLAN aktiviert sind (und aktivieren) sollte anfordern, die Berechtigung zur Verwendung der Funktionen. –

+0

Ich habe versucht, dies auf einem virtuellen Gerät mit Android m, das Ergebnis war kein Dialog fragt nach der Erlaubnis, stattdessen onRequestPermission zurückgegebene Berechtigung verweigert sofort – user1354603

7

Bearbeiten

So scheint das Problem mit der neuen Erlaubnis Handhabung zu sein. Sie müssen um Erlaubnis fragen, bevor Sie mit dem WLAN-Code fortfahren. Hier ein Beispiel:

// call this method only if you are on 6.0 and up, otherwise call doGetWifi() 
private void getWifi() { 
    if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 0x12345); 
    } else { 
     doGetWifi(); // the actual wifi scanning 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    if (requestCode == 0x12345) { 
     for (int grantResult : grantResults) { 
      if (grantResult != PackageManager.PERMISSION_GRANTED) { 
       return; 
      } 
     } 
     getWifi(); 
    } 
} 

Diese Überprüfung muss in einer Aktivität durchgeführt werden.

Der ursprüngliche Beispielcode ist verfügbar here, geändert entsprechend dem Problem, das in diesem Thema behandelt wird.

Original-

Nach dem verknüpften changes of the API, muss Ihre Anwendung eines der Standort Berechtigungen verfügen. Zitat:

WifiManager.getScanResults(): Ihre App muss ACCESS_FINE_LOCATION oder ACCESS_COARSE_LOCATION Erlaubnis haben.

Beachten Sie auch, dass es eine new boolean key von Ihrem BroadcastReceiver auf SCAN_RESULTS_AVAILABLE_ACTION Aktion erhalten ist: EXTRA_RESULTS_UPDATED. Dies zeigt an, ob der Scan abgeschlossen ist und Sie auf die Ergebnisse zugreifen können, indem Sie wifiManager.getScanResults() aufrufen.

+1

Hallo @Gergely Kőrössy, danke für die Antwort. Da meine App über Standortfunktionen verfügt, sind diese Berechtigungen derzeit in der App aktiviert. ' ' –

+0

@DeividiCavarzan, beachten sie, dass es ein neues extra in der Paket, das vom BroadcastReceiver empfangen wurde: http://developer.android.com/reference/android/net/wifi/WifiManager.html#EXTRA_RESULTS_UPDATED –

+0

Ja, ich suche nach und gebe wahr wie erwartet zurück und zeigt an, dass es sich um verfügbare Netzwerke handelt. Der zurückgegebene Wifi-Status ist ebenfalls 3, 'WIFI_STATE_ENABLED' –

28

Ich finde verwandtes Problem in AOSP Problem Tracker Problem 185370 WifiManager # getScanResults() gibt eine leere Array-Liste, wenn GPS ausgeschaltet ist.

Das Problem erwähnt von #1, das Handy muss Ortungsdienst öffnen, um Wifi Liste von Mobiltelefonen zu erhalten.

Und von #18, behauptet das Android-Projektmitglied, dass das Entwicklungsteam das Problem behoben hat, das Sie gemeldet haben, und es wird in einem zukünftigen Build verfügbar sein.

Die APP befindet sich in targetSdkVersion 23, befolgen Sie einfach die obige Lösung, um die Laufzeitberechtigung zu überprüfen. Das Erzwingen des Aktivierens von Standortdiensten wird in zukünftigen Android-Versionen behoben.

+0

Dieses Problem wurde noch nicht behoben, oder? Ich teste es auf einem Lenovo Telefon mit 6.0 und immer noch dieses Problem. – camelCaseCoder

+0

danke für Ihren Vorschlag – cxphong

+0

Das Problem von https://code.google.com/p/android/issues/detail?id=185370#c70 Antwort darauf hinweist, dass es scheint, dass immer noch Android N (Vorschau) das gleiche Verhalten hat weit. –

1

Zusätzlich zu den angegebenen Antworten; Sie können auch checkSelfPermission von ContextCompat verwenden für die Abwärtskompatibilität mit niedrigeren Android-Versionen zu ermöglichen:

if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
    requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_CODE_ACCESS_FINE_LOCATION); 
    // Get the result in onRequestPermissionsResult(int, String[], int[]) 
} else { 
    // Permission was granted, do your stuff here 
} 
Verwandte Themen