Odczytywanie stanu połączenia z siecią GSM (telefonia) 0. Niezbędne uprawnienie READ_PHONE_STATE W pliku manifestu, w obrębie elementu manifest: 1. W Android >=6 należy zdobyć te uprawnienia dla procesu: public static final int REQUEST_READ_PHONE_STATE = 0; static private boolean zdobądźUprawnieniaDoOdczytaniaWłasnościGSM(Activity activity) { int permissionCheck = ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_PHONE_STATE); if (permissionCheck != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE); return false; } else { //Toast.makeText(activity.getApplicationContext(), "Aplikacja posiada już uprawnienia do odczytania stanu telefonu", Toast.LENGTH_LONG).show(); return true; } } Po przydzieleniu uprawnień (okno dialogowe) wywołana zostanie metoda: @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case REQUEST_READ_PHONE_STATE: if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) { //Toast.makeText(getApplicationContext(), "Udzielono uprawnienia do odczytania stanu telefonu", Toast.LENGTH_LONG).show(); odswiezListe(); } break; default: break; } } 2. Odczytanie stanu sieci: static private UrzadzenieInfo odczytajSiećTelefoniczną(Activity activity, SignalStrength signalStrength) { UrzadzenieInfo gsmInfo = new UrzadzenieInfo(); gsmInfo.typInformacji=TypInformacji.Inne; gsmInfo.nazwa="Sieć GSM"; TelephonyManager tm = (TelephonyManager) activity.getSystemService(TELEPHONY_SERVICE); //menadzer gsm //GsmCellLocation loc = (GsmCellLocation) tm.getCellLocation(); //lokalizacja telefonu przez gsm if(tm != null) { gsmInfo.opis = "IMEI: "+tm.getDeviceId(); //gsmInfo.opis = "\nID: "+loc.getCid(); gsmInfo.opis += "\nOperator: "+tm.getNetworkOperatorName(); String typSieciTelefonicznej = ""; switch(tm.getNetworkType()) { case TelephonyManager.NETWORK_TYPE_1xRTT: typSieciTelefonicznej="1xRTT"; break; case TelephonyManager.NETWORK_TYPE_CDMA: typSieciTelefonicznej="CDMA"; break; case TelephonyManager.NETWORK_TYPE_EDGE: typSieciTelefonicznej="EDGE"; break; case TelephonyManager.NETWORK_TYPE_EHRPD: typSieciTelefonicznej="eHRPD"; break; case TelephonyManager.NETWORK_TYPE_EVDO_0: typSieciTelefonicznej="EVDO rev. 0"; break; case TelephonyManager.NETWORK_TYPE_EVDO_A: typSieciTelefonicznej="EVDO rev. A"; break; case TelephonyManager.NETWORK_TYPE_EVDO_B: typSieciTelefonicznej="EVDO rev. B"; break; case TelephonyManager.NETWORK_TYPE_GPRS: typSieciTelefonicznej="GPRS"; break; case TelephonyManager.NETWORK_TYPE_HSDPA: typSieciTelefonicznej="HSDPA"; break; case TelephonyManager.NETWORK_TYPE_HSPA: typSieciTelefonicznej="HSPA"; break; case TelephonyManager.NETWORK_TYPE_HSPAP: typSieciTelefonicznej="HSPA+"; break; case TelephonyManager.NETWORK_TYPE_HSUPA: typSieciTelefonicznej="HSUPA"; break; case TelephonyManager.NETWORK_TYPE_IDEN: typSieciTelefonicznej="iDen"; break; case TelephonyManager.NETWORK_TYPE_LTE: typSieciTelefonicznej="LTE"; break; case TelephonyManager.NETWORK_TYPE_UMTS: typSieciTelefonicznej="UMTS"; break; case TelephonyManager.NETWORK_TYPE_UNKNOWN: typSieciTelefonicznej="Unknown"; break; } gsmInfo.opis += "\nTyp sieci: "+typSieciTelefonicznej; gsmInfo.opis += "\nNumer telefonu: " + tm.getLine1Number(); String stanPołączenia = ""; switch(tm.getCallState()) { case TelephonyManager.CALL_STATE_RINGING: stanPołączenia = "Dzwonienie"; break; case TelephonyManager.CALL_STATE_OFFHOOK: stanPołączenia = "Zajęty"; break; case TelephonyManager.CALL_STATE_IDLE: stanPołączenia = "Wolny"; break; } gsmInfo.opis += "\nStan połączenia: " + stanPołączenia; if(signalStrength != null) gsmInfo.polozeniePaska = signalStrength.getLevel() * 25; //0-4, wymaga API 22 -> trzeba zwiększyć else gsmInfo.polozeniePaska = -1; } else { //nie ma połączenia gsmInfo.polozeniePaska=-1; } return gsmInfo; } 3. Uruchomienie w metodzie odswiezListe: if(zdobądźUprawnieniaDoOdczytaniaWłasnościGSM(this)) { listaUrzadzen.add(odczytajSiećTelefoniczną(this, null)); //na razie bez siły sygnału } 4. Nasłuchiwacz do monitorowania siły sygnału: PhoneStateListener phoneStateListener = null; SignalStrength signalStrength = null; Rozwinięcie kodu z metody odswiezListe if(zdobądźUprawnieniaDoOdczytaniaWłasnościGSM(this)) { if(phoneStateListener == null) { phoneStateListener = new PhoneStateListener() { @Override public void onSignalStrengthsChanged(SignalStrength _signalStrength) { signalStrength = _signalStrength; odswiezListe(); } }; TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE); tm.listen(phoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); } listaUrzadzen.add(odczytajSiećTelefoniczną(this, signalStrength)); //teraz przekazywanie siły sygnału } ------------------------------------------------------ Odczytywanie stanu sieci radiowej WiFi Uprawnienia: Zdobywanie uprawnień przez proces: static private boolean zdobądźUprawnieniaDoOdczytaniaWłasnościWiFi(Activity activity) { int permissionCheck = ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_WIFI_STATE); if (permissionCheck != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_WIFI_STATE}, REQUEST_ACCESS_WIFI_STATE); return false; } else { //Toast.makeText(activity.getApplicationContext(), "Aplikacja posiada już uprawnienia do odczytania stanu telefonu", Toast.LENGTH_LONG).show(); return true; } } Zmiana w istniejącej metodzie: @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case REQUEST_READ_PHONE_STATE: if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) { //Toast.makeText(getApplicationContext(), "Udzielono uprawnienia do odczytania stanu telefonu", Toast.LENGTH_LONG).show(); odswiezListe(); } break; case REQUEST_ACCESS_WIFI_STATE: if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) { //Toast.makeText(getApplicationContext(), "Udzielono uprawnienia do odczytania stanu sieci WiFi", Toast.LENGTH_LONG).show(); odswiezListe(); } break; default: break; } } Odczytywanie informacji o sieci WiFi: static private UrzadzenieInfo odczytajSiećWiFi(Activity activity) { UrzadzenieInfo wifiInfo = new UrzadzenieInfo(); wifiInfo.typInformacji=TypInformacji.Inne; wifiInfo.nazwa="Sieć WiFi"; WifiManager wm = (WifiManager) activity.getApplicationContext().getSystemService(WIFI_SERVICE); if(wm != null) { WifiInfo wi = wm.getConnectionInfo(); if (wi != null) { wifiInfo.opis = "SSID: " + wi.getSSID(); wifiInfo.opis += "\nIP: " + wi.getIpAddress(); wifiInfo.opis += "\nMAC: " + wi.getMacAddress(); int rssi = wi.getRssi(); wifiInfo.polozeniePaska = WifiManager.calculateSignalLevel(rssi, 100); } else wifiInfo.polozeniePaska = -1; wifiInfo.opis += "\nDostępne sieci: "; List _wis = wm.getConfiguredNetworks(); if(_wis != null) { for (WifiConfiguration _wi : _wis) { wifiInfo.opis += "\n\t" + _wi.SSID; } } else wifiInfo.opis += "---"; } else { //nie ma połączenia wifiInfo.polozeniePaska=-1; } return wifiInfo; } Wywołanie tej metody należy dodać do odwiezListe. Jeżeli chcemy być powiadamiani o zmianach w sieci WiFi (UWAGA! Bardzo częste powiadomienia), należy ustalić BroadcastReceiver: BroadcastReceiver wifiReceiver = null; Date czasOstatniegoOdświeżeniaWiFi = null; final long czasMiędzyOdświeżeniamiWiFi = 10000; W metodzie odswiezListe: if (wifiReceiver == null) wifiReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //UWAGA! To jest wywoływane bardzo częstp if(intent.getAction() == WifiManager.WIFI_STATE_CHANGED_ACTION) { Date bieżącyCzas = new Date(); if(czasOstatniegoOdświeżeniaWiFi == null || (bieżącyCzas.getTime() - czasOstatniegoOdświeżeniaWiFi.getTime() > czasMiędzyOdświeżeniamiWiFi)) { czasOstatniegoOdświeżeniaWiFi = bieżącyCzas; //Toast.makeText(context, "Zmiana stanu WiFi", Toast.LENGTH_LONG).show(); //odswiezListe(); } } } }; IntentFilter _intentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); final Intent _intent = this.getApplicationContext().registerReceiver(wifiReceiver, _intentFilter);