Odczytywanie stanu urządzenia ----------------------------- Rozpoczynamy od gotowego projektu Xamarin (08_StanUrzadzenia_0_START.zip) 5. Bateria - można zareestrować nasłuchiwacza i być powiadamianym o zmianach stanu. a. Definiujemy pole BroadcastReceiver batteryReceiver = null; b. Inicjujemy je i definiujemy intent (intencję) w metodzie odswiezListe. Wywolujemy tez metode odczytajStanBaterii, której jeszcze nie ma: class BatteryReveiver : BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { int bateriaPoziom = intent.GetIntExtra(BatteryManager.ExtraLevel, -1); if (bateriaPoziom < 10) Toast.MakeText(context, "Niski stan baterii", ToastLength.Long).Show(); //odswiezListe(); } } BroadcastReceiver batteryReceiver; private void odswiezListe() { int pozycja = listView.FirstVisiblePosition; View v = listView.GetChildAt(0); int top = (v == null) ? 0 : v.Top; List listaUrządzeń = new List(); listaUrządzeń.Add(odczytajWersjęSystemu(this)); listaUrządzeń.Add(odczytajStanPamięci(this)); listaUrządzeń.Add(odczytajStanGłównejKartyPamięci(this)); listaUrządzeń.Add(odczytajStanDodatkowejKartyPamięci(this)); listaUrządzeń.Add(odczytajStanProcesora(this)); batteryReceiver = new BatteryReveiver(); IntentFilter intentFilter = new IntentFilter(Intent.ActionBatteryChanged); Intent intent = this.ApplicationContext.RegisterReceiver(batteryReceiver, intentFilter); listaUrządzeń.Add(odczytajStanBaterii(this, intent)); UrzadzeniaAdapter a = new UrzadzeniaAdapter(this, Resource.Layout.wiersz, listaUrządzeń); listView.Adapter = a; listView.SetSelectionFromTop(pozycja, top); } c. Definiujemy funkcję odczytującą stan baterii: static private UrządzenieInfo odczytajStanBaterii(Activity activity, Intent intent) { //Bateria (API 5) UrządzenieInfo bateriaInfo = new UrządzenieInfo(); bateriaInfo.typInformacji = TypInformacji.StanUrzadzenia; bateriaInfo.nazwa = "Bateria"; if (intent.GetBooleanExtra(BatteryManager.ExtraPresent, false)) { String bateriaTechnologia = intent.GetStringExtra(BatteryManager.ExtraTechnology); BatteryStatus bateriaStan = (BatteryStatus)intent.GetIntExtra(BatteryManager.ExtraStatus, -1); String bateriaStanOpis = ""; switch (bateriaStan) { case BatteryStatus.Charging: bateriaStanOpis = "ładowanie"; break; case BatteryStatus.Discharging: bateriaStanOpis = "rozładowywanie"; break; case BatteryStatus.Full: bateriaStanOpis = "w pełni naładowana"; break; case BatteryStatus.NotCharging: bateriaStanOpis = "nie ładowana"; break; default: case BatteryStatus.Unknown: bateriaStanOpis = "nieznany"; break; } BatteryPlugged bateriaMetodaLadowania = (BatteryPlugged)intent.GetIntExtra(BatteryManager.ExtraPlugged, -1); String bateriaMetodaLadowaniaOpis = ""; switch (bateriaMetodaLadowania) { case BatteryPlugged.Ac: bateriaMetodaLadowaniaOpis = "AC"; break; case BatteryPlugged.Usb: bateriaMetodaLadowaniaOpis = "USB"; break; case BatteryPlugged.Wireless: bateriaMetodaLadowaniaOpis = "wireless"; break; default: bateriaMetodaLadowaniaOpis = "-"; break; } int bateriaSkala = intent.GetIntExtra(BatteryManager.ExtraScale, -1); int bateriaPoziom = intent.GetIntExtra(BatteryManager.ExtraLevel, -1); int bateriaNapiecie = intent.GetIntExtra(BatteryManager.ExtraVoltage, -1); int bateriaTemperatura = intent.GetIntExtra(BatteryManager.ExtraTemperature, -1); bateriaInfo.opis = "Technologia: " + bateriaTechnologia + ", stan: " + bateriaStanOpis + " (" + bateriaMetodaLadowaniaOpis + "), poziom naładowania baterii: " + bateriaPoziom + "/" + bateriaSkala + ", napięcie: " + bateriaNapiecie / 1000 + " V, temperatura: " + bateriaTemperatura / 10 + " °C"; bateriaInfo.polozeniePaska = bateriaPoziom * 100 / bateriaSkala; } else { bateriaInfo.opis = "Brak"; bateriaInfo.polozeniePaska = -1; } return bateriaInfo; } d. W metodzie onPause wyrejestrowujemy powiadamianie o zmianie stanu baterii: protected override void OnPause() { base.OnPause(); if (batteryReceiver != null) this.ApplicationContext.UnregisterReceiver(batteryReceiver); } Uwaga! Możliwa jest kontrola stanu baterii z ustawień emulatora 6. Lista dodatkowych urządzeń (wymaga API 5): static private UrządzenieInfo odczytajObecnoscDodatkowychUrzadzen(Activity activity) { //Dodatkowe urządzenia UrządzenieInfo dodatkoweInfo = new UrządzenieInfo(); dodatkoweInfo.typInformacji = TypInformacji.Inne; dodatkoweInfo.nazwa = "Dodatkowe urządzenia"; dodatkoweInfo.polozeniePaska = -1; PackageManager pm = activity.PackageManager; bool czyTelefonObecny = pm.HasSystemFeature(PackageManager.FeatureTelephony); dodatkoweInfo.opis = "Telefon: " + (czyTelefonObecny ? "obecny" : "brak"); if (czyTelefonObecny) { dodatkoweInfo.opis += pm.HasSystemFeature(PackageManager.FeatureTelephonyGsm) ? " (GSM)" : ""; dodatkoweInfo.opis += pm.HasSystemFeature(PackageManager.FeatureTelephonyCdma) ? " (CDMA)" : ""; } bool czyKameraObecna = pm.HasSystemFeature(PackageManager.FeatureCamera); dodatkoweInfo.opis += "\nAparat fotograficzny/kamera: " + (czyKameraObecna ? "obecna" : "brak"); if (czyKameraObecna) { dodatkoweInfo.opis += "\n\tautomatyczna regulacja ostrości: " + (pm.HasSystemFeature(PackageManager.FeatureCameraAutofocus) ? "obecna" : "brak"); dodatkoweInfo.opis += "\n\tlampa błyskowa: " + (pm.HasSystemFeature(PackageManager.FeatureCameraFlash) ? "obecna" : "brak"); } dodatkoweInfo.opis += "\nCzujnik światła: " + (pm.HasSystemFeature(PackageManager.FeatureSensorLight) ? "obecny" : "brak"); dodatkoweInfo.opis += "\nCzujnik zbliżeniowy: " + (pm.HasSystemFeature(PackageManager.FeatureSensorProximity) ? "obecny" : "brak"); dodatkoweInfo.opis += "\nEkran wielodotykowy: " + (pm.HasSystemFeature(PackageManager.FeatureTouchscreenMultitouch) ? "obecny" : "brak"); dodatkoweInfo.opis += "\nAnimowana tapeta: " + (pm.HasSystemFeature(PackageManager.FeatureLiveWallpaper) ? "obecna" : "brak"); return dodatkoweInfo; } 7. [POMINĄĆ] Stan audio (NIE DZIAŁA PRZEZ ZDALNY PULPIT!): static private UrządzenieInfo odczytajStanAudio(Activity activity) { //Stan audio UrządzenieInfo audioInfo = new UrządzenieInfo(); audioInfo.typInformacji = TypInformacji.Inne; audioInfo.nazwa = "Audio"; audioInfo.polozeniePaska = -1; AudioManager am = (AudioManager)activity.GetSystemService(Context.AudioService); Mode trybAudio = am.Mode; String trybAudioOpis = "Tryb audio: "; switch (trybAudio) { case Mode.Normal: trybAudioOpis += "normalny"; break; case Mode.Ringtone: trybAudioOpis += "dzwonki"; break; case Mode.InCall: trybAudioOpis += "w trakcie rozmowy (telefon)"; break; case Mode.InCommunication: trybAudioOpis += "w trakcie rozmowy (VoIP)"; break; default: case Mode.Invalid: trybAudioOpis += "niezanany lub niepoprawny"; break; } audioInfo.opis = trybAudioOpis; RingerMode trybDzwonka = am.RingerMode; String trybDzwonkaOpis = "Rodzaj dzwonka: "; switch (trybDzwonka) { case RingerMode.Normal: trybDzwonkaOpis += "normalny"; break; case RingerMode.Silent: trybDzwonkaOpis += "wyciszony"; break; case RingerMode.Vibrate: trybDzwonkaOpis += "wibracje"; break; default: trybDzwonkaOpis += "niezanany"; break; } audioInfo.opis += "\n" + trybDzwonkaOpis; audioInfo.opis += "\nWyciszenie mikrofonu: " + (am.MicrophoneMute ? "tak" : "nie"); //nie działa - znany problem audioInfo.opis += "\nOdtwarzanie muzyki: " + (am.IsMusicActive ? "tak" : "nie"); audioInfo.opis += "\nGłośność systemu: " + am.GetStreamVolume(Stream.System) + "/" + am.GetStreamMaxVolume(Stream.System); audioInfo.opis += "\nGłośność dzwonka: " + am.GetStreamVolume(Stream.Ring) +"/" + am.GetStreamMaxVolume(Stream.Ring); audioInfo.opis += "\nGłośność alarmu: " + am.GetStreamVolume(Stream.Alarm) + "/" + am.GetStreamMaxVolume(Stream.Alarm); audioInfo.opis += "\nGłośność rozmowy: " + am.GetStreamVolume(Stream.VoiceCall) + "/" + am.GetStreamMaxVolume(Stream.VoiceCall); audioInfo.opis += "\nGłośność powiadomień: " + am.GetStreamVolume(Stream.Notification) + "/" + am.GetStreamMaxVolume(Stream.Notification); audioInfo.polozeniePaska = 100 * am.GetStreamVolume(Stream.System) / am.GetStreamMaxVolume(Stream.System); return audioInfo; } 8. Odczytać listę czujników/sensorów (NIE DZIAŁA PRZEZ ZDALNY PULPIT!): static private String opisCzujnika(IList lista, string nazwa) { string opis = nazwa + ": "; if (lista.Count > 1) opis += "\n"; if (lista.Count > 0) for (int i = 0; i < lista.Count; ++i) { if (lista.Count > 1) opis += "\t"; Sensor czujnik = lista[i]; opis += czujnik.Name + ", wersja: " + czujnik.Version + "\n"; } else opis += "brak\n"; return opis; } static private UrządzenieInfo odczytajObecnoscCzujnikow(Activity activity) { //Dodatkowe urządzenia UrządzenieInfo czujnikiInfo = new UrządzenieInfo(); czujnikiInfo.typInformacji = TypInformacji.Inne; czujnikiInfo.nazwa = "Czujniki"; czujnikiInfo.polozeniePaska = -1; SensorManager sm = (SensorManager)activity.GetSystemService(Context.SensorService); czujnikiInfo.opis = opisCzujnika(sm.GetSensorList(SensorType.Accelerometer), "Akcelerator"); czujnikiInfo.opis += opisCzujnika(sm.GetSensorList(SensorType.Gyroscope), "Żyroskop"); czujnikiInfo.opis += opisCzujnika(sm.GetSensorList(SensorType.Light), "Światło"); czujnikiInfo.opis += opisCzujnika(sm.GetSensorList(SensorType.MagneticField), "Pole magnetyczne"); czujnikiInfo.opis += opisCzujnika(sm.GetSensorList(SensorType.Orientation), "Orientacja"); //przestarzałe, choć wygodne czujnikiInfo.opis += opisCzujnika(sm.GetSensorList(SensorType.Pressure), "Ciśnienie"); czujnikiInfo.opis += opisCzujnika(sm.GetSensorList(SensorType.Proximity), "Odległość"); czujnikiInfo.opis += opisCzujnika(sm.GetSensorList(SensorType.Temperature), "Temperatura"); czujnikiInfo.opis += opisCzujnika(sm.GetSensorList(SensorType.AmbientTemperature), "Temperatura otoczenia"); return czujnikiInfo; }