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<Urz�dzenieInfo> listaUrz�dze� = new List<Urz�dzenieInfo>();
            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<Sensor> 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;
        }