Ich muss die aktuelle WLAN-SSID unter Android überprüfen. Ich habe mit Nokia 6 und OnePlus 5 mit Oreo 8.1.0 bzw. Oreo 8.0 überprüft. Andere Telefone mit unterschiedlichen Betriebssystemversionen funktionieren mit diesem Code einwandfrei. Stimmt mein Code nicht?
private WifiInfo wifiInfo;
private String ssid = "";
private WifiManager wifiManager;
private boolean getWifiStatus() {
wifiManager= (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiInfo = wifiManager.getConnectionInfo();
ssid = "";
ssid = wifiInfo.getSSID();
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isWiFi = false;
if(activeNetwork != null){
isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
}
Log.d(TAG, "getWifiStatus: " + ssid);
if(ssid.contains("TripleMZim") && wifiManager.isWifiEnabled() && isWiFi ){
return true;
}
else{
return false;
}
}
erlaubnis in Manifest-Datei:
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE"/>
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission Android:name="Android.permission.INTERNET"/>
Für Oreo 8.1+ -Geräte müssen die Berechtigung für die grobe Standortlaufzeit sowie Standortdienste aktiviert sein, bevor die verbundene SSID abgerufen werden kann, da der Standort des Benutzers ermittelt werden kann.
Weitere Informationen sind hier verfügbar
Was sich auf this bezieht
In Android Oreo können Sie ConnectivityManager
verwenden, um Ihre WLAN-SSID zu ermitteln.
Genehmigung
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
Code zum Abrufen der SSID
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
String ssid = info.getExtraInfo();
Log.d(TAG, "WiFi SSID: " + ssid);
}
Dies wurde in Android Oreo 8.1.0 getestet. Sie erhalten eine SSID mit doppelten Anführungszeichen.
Es gibt verschiedene Ansätze, wie Sie die WIFI-Informationen (z. B. SSID) in Android abrufen können.
Einige davon sind oben bereits aufgeführt, zum Beispiel WifiManager service.
Aber für OP-Frage:
Stimmt mein Code nicht?
Nein, das Problem liegt nicht in Ihrem Code. Der Hauptgrund für das unerwartete Verhalten ist auf das Sicherheitspatch der letzten Android-Versionen zurückzuführen.
Vor dem Patch (oder einem Gerät, das kein Update erhalten hat) konnten die Hacker vertrauliche Informationen stehlen, die durch die WLAN-Informationen durchgesickert wurden.
Beispielsweise könnten die Hacker die Geolocation des Geräts erhalten, auf die nur mit dem Dangerous Permission_ORT zugegriffen werden sollte, die zur Laufzeit angefordert werden sollte und jederzeit widerrufen werden kann. Andererseits ist die WifiInfo
nur mit der Normal PermissionAndroid.permission.ACCESS_WIFI_STATE
zugänglich, die zum Installationszeitpunkt erteilt wird und nicht widerrufen werden kann. Auf diese Weise können Hacker den Berechtigungsmechanismus und den Zugriff vollständig umgehen die Daten von gefährlichen Erlaubnis nur mit normaler Erlaubnis.
Das Problem wurde von CVE-2018-9489
gemeldet und verfolgt. Weitere Informationen hierzu finden Sie hier: Vertrauliche Informationen werden über WIFI verfügbar gemacht
Der Grund, warum Sie diese Probleme haben, ist deshalb, weil Android jetzt die sensiblen WLAN-Informationen blockiert, es sei denn, die App enthält den ACCESS_COARSE_LOCATION
oder ACCESS_FINE_LOCATION
.
Wenn Sie diese Berechtigungen explizit anfordern (und vom Benutzer zugelassen werden), sollte Ihr Code einwandfrei funktionieren.
Zum Beispiel:
Manifest
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE"/>
Aktivität
private static final int LOCATION = 1;
protected void onStart() {
super.onStart();
//Assume you want to read the SSID when the activity is started
tryToReadSSID();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED && requestCode == LOCATION){
//User allowed the location and you can read it now
tryToReadSSID();
}
}
private void tryToReadSSID() {
//If requested permission isn't Granted yet
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
//Request permission from user
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION);
}else{//Permission already granted
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
if(wifiInfo.getSupplicantState() == SupplicantState.COMPLETED){
String ssid = wifiInfo.getSSID();//Here you can access your SSID
System.out.println(ssid);
}
}
}
Sie müssen die Erlaubnis im Manifest anfordern:
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
und fordere es in deiner Aktivität an:
private void grantPermm()
{
try
{
if (ContextCompat.checkSelfPermission(MainScreenActivity.this,
Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
{
}
else
{
ActivityCompat.requestPermissions(MainScreenActivity.this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
101);
}
}
catch (Exception xx){}
}
dann benutzen Sie diese Funktion:
public static String getWifiName(Context context)
{
String result="";
try {
WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (manager.isWifiEnabled())
{
WifiInfo wifiInfo = manager.getConnectionInfo();
if (wifiInfo != null)
{
NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState());
if (state == NetworkInfo.DetailedState.CONNECTED || state == NetworkInfo.DetailedState.OBTAINING_IPADDR)
{
result = wifiInfo.getSSID();
if(result.equalsIgnoreCase("<unknown ssid>"))
{
Toast.makeText(context,"You are connected to mobile data", Toast.LENGTH_SHORT).show();
result="";
}
return result;
}
else
{
Toast.makeText(context,"WIFI not connected", Toast.LENGTH_SHORT).show();
return "";
}
}
else
{
Toast.makeText(context,"No WIFI Information", Toast.LENGTH_SHORT).show();
return "";
}
}
else
{
Toast.makeText(context,"WIFI not enabled", Toast.LENGTH_SHORT).show();
return "";
}
}
catch (Exception xx)
{
Toast.makeText(context, xx.getMessage().toString(), Toast.LENGTH_SHORT).show();
return "";
}
}
Wenn Sie auf API 29 (Android 10) abzielen, muss die angeforderte Standortberechtigung jetzt ACCESS_FINE_LOCATION und nicht nur ACCESS_COARSE_LOCATION lauten. Der größte Teil des obigen Beispielcodes ist in Ordnung, jedoch können einige Antworten im Text irreführend sein.
https://developer.Android.com/about/versions/10/privacy/changes
Wenn Sie Probleme haben, nachdem Sie die Antworten von Yaswant Narayan ausprobiert haben und sich verhalten haben, stellen Sie sicher, dass Sie die Position/GPS im Gerät aktiviert haben, während Sie versuchen, die SSID abzurufen. Obwohl Sie die entsprechenden Berechtigungen für Android Oreo und andere Geräte erworben haben, wird der Standort bzw. das GPS-Gerät vom Benutzer deaktiviert, und Sie erhalten die entsprechenden Berechtigungen.
Sie müssen die Laufzeitberechtigung zum Lesen des Telefonstatus anfordern. Dies dient der besseren Sicherheit.
code lautet wie folgt: -
TelephonyManager telephonyManager = (TelephonyManager) getContext()
.getSystemService(Context.TELEPHONY_SERVICE);
String IMEI ="";
if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.READ_PHONE_STATE},
123);
}
int permission = ContextCompat.checkSelfPermission(getContext(),
Manifest.permission.READ_PHONE_STATE);
if(permission == PackageManager.PERMISSION_GRANTED){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
IMEI = telephonyManager.getImei();
}
else{
IMEI = telephonyManager.getDeviceId();
}
}