Georg fährt extra nach Berlin um Steve Ballmer zu treffen

31 Tage Mango | Tag #2: DeviceStatus

Die­ser Arti­kel ist Tag #2 der Serie 31 Tage Man­go von Jeff Blan­ken­burg.

Der Ori­gi­nal­ar­ti­kel befin­det sich hier: Day #2: Device­Sta­tus.

Heu­te geht es um die Device­Sta­tus Klas­se und die Infor­ma­tio­nen, die wir mit Hil­fe die­ser Klas­se über das Benut­zer­ge­rät her­aus­fin­den kön­nen.

Die in die­sem Arti­kel beschrie­be­ne Anwen­dung ist im Win­dows Pho­ne Mar­ket­place ver­füg­bar.

Was können wir über den Benutzer erfahren?

Die­se Fra­ge bekom­me ich recht oft gestellt und übli­cher­wei­se ant­wor­te ich mit „sehr wenig“. Sie wer­den nie Zugriff auf die Tele­fon­num­mer, Email Adres­se oder auf die Iden­ti­tät des Benut­zers bekom­men, außer der Benut­zer stellt Ihnen die­se Infor­ma­tio­nen bereit­wil­lig zur Ver­fü­gung. Was wir erfah­ren kön­nen, ist aber trotz­dem nütz­li­che Infor­ma­ti­on und sei es nur, um die Benutz­bar­keit der Anwen­dung zu ver­bes­sern. Hier ist eine Lis­te der Daten, die die Device­Info Klas­se kennt:

  • Gerä­te­her­stel­ler
  • Gerä­te­na­me
  • Firm­ware Ver­si­on
  • Hard­ware Ver­si­on
  • Grö­ße des Haupt­spei­chers
  • Zur Zeit beleg­ter Haupt­spei­cher
  • Gren­ze der Haupt­spei­cher­aus­las­tung
  • Spit­ze der Haupt­spei­cher­aus­las­tung
  • Ver­füg­bar­keit einer phy­si­schen Tas­ta­tur
  • Sta­tus der phy­si­schen Tas­ta­tur
  • Aktu­el­le Strom­quel­le

Wir kön­nen zudem Events set­zen, die uns bei Ände­rung des Sta­tus‘ der Tas­ta­tur oder der Strom­quel­le benach­rich­ti­gen. Betrach­ten wir jeden der Daten­punk­te und wie wir sie ver­wen­den kön­nen. Um auf eine der Eigen­schaf­ten zugrei­fen zu kön­nen, müs­sen Sie oben in der Page ein using State­ment hin­zu­fü­gen:

using Microsoft.Phone.Info;

Kei­ne der Eigen­schaf­ten wird Ihnen ermög­li­chen, ein Gerät ein­deu­tig zu iden­ti­fi­zie­ren. Sie erlau­ben es aber, Her­stel­ler, Modell, Soft­ware­ver­si­on usw. zu bestim­men. Dies kann nütz­lich sein, wenn Sie bei­spiels­wei­se für eine bestimm­te Hard­ware opti­mie­ren möch­ten. In der Bei­spiel­an­wen­dung für die­sen Arti­kel schrei­ben wir alle Wer­te in einen Text­Block mit einem ent­spre­chen­den Namen. Wir wer­den also die lee­ren Stel­len im fol­gen­den Screen­shot mit Leben fül­len:

Device Manufacturer (string)

Wie zu erwar­ten, lie­fert die­se Eigen­schaft den Namen des Gerä­te­her­stel­lers. Im Emu­la­tor wird die­se Eigen­schaft „Micro­soft“ anzei­gen. Um den Wert der Eigen­schaft im Text­Block anzu­zei­gen kön­nen Sie fol­gen­de Zei­le ver­wen­den:

DeviceManufacturer.Text = DeviceStatus.DeviceManufacturer;

Device Name (string)

Dies ist ein spe­zi­fi­scher Name für das Gerät — aller­dings nicht immer der, den Sie erwar­ten wür­den. Ich besit­ze bei­spiels­wei­se ein HTC Arri­ve im Netz von Sprint. Wenn ich jedoch die Anwen­dung auf mei­nem Tele­fon aus­füh­re, wird als Device­Na­me T7575 gemel­det. Das ist der Name, den HTC für die­ses spe­zi­el­le Gerät ver­wen­det. Um den Gerä­te­na­men von der Device­Sta­tus Klas­se abzu­fra­gen kön­nen Sie fol­gen­den Code ver­wen­den:

DeviceName.Text = DeviceStatus.DeviceName;

Die­se Infor­ma­ti­on kann auch inter­es­sant sein, wenn Sie mit­be­kom­men wol­len, wann die Her­stel­ler ihre neu­en Gerä­te tes­ten. Indem Sie die Namen der ver­schie­de­nen Gerä­te nach Hau­se fun­ken, wer­den Sie der ers­te sein, der über ein kurz vor der Markt­ein­füh­rung ste­hen­des Gerät Bescheid weiß (Anm. leit­ning: nun­ja).

Firmware Version (string)

Die Ver­si­on der Firm­ware ist mög­li­cher­wei­se nicht über­mä­ßig inter­es­sant, da es extrem vie­le ver­schie­de­ne Firm­ware­ver­sio­nen für die ver­schie­de­nen Gerä­te gibt. Die Ver­si­on der Firm­ware kann jedoch Auf­schluss dar­über geben, ob ein Win­dows Pho­ne Update bereits ein­ge­spielt wur­de oder nicht. Die Firm­ware­ver­si­on mei­nes HTC Arri­ve ist bei­spiels­wei­se 2305.13.40301.651. Die­se Ver­si­on steht für das Man­go Release. Um auf die­se Daten zuzu­grei­fen, ver­wen­den Sie die fol­gen­de Sny­tax:

FirmwareVersion.Text = DeviceStatus.DeviceFirmwareVersion;

Hardware Version (string)

Wie vie­le Sam­sung Focus Benut­zer erfah­ren haben, kann die Hard­ware­ver­si­on einen gro­ßen Unter­schied machen zwi­schen ansons­ten glei­chen Gerä­ten. Soll­ten Sie nicht davon gehört haben: Es gibt Focus Gerä­te in der Ver­si­on 1.3 und in der Ver­si­on 1.4. Anschei­nend haben die 1.3 Focus Tele­fo­ne grö­ße­re Schwie­rig­kei­ten, Updates zu bekom­men, obwohl es sich an sich um die glei­chen Tele­fo­ne han­delt. Um fest­zu­stel­len, wel­che Hard­ware­ver­si­on Ihr Benut­zer ver­wen­det, schrei­ben Sie den fol­gen­den Code:

HardwareVersion.Text = DeviceStatus.DeviceHardwareVersion;

Device Total Memory (long)

Dies ist der phy­si­ka­lisch im Gerät ver­füg­ba­re Haupt­spei­cher. Die­ser Wert wird nicht über­ein­stim­men mit dem Wert, der auf der Ver­pa­ckung des Geräts steht. Statt des­sen lie­fert die­ser Wert den ver­füg­ba­ren Haupt­spei­cher für das Gerät nach­dem sich das Betriebs­sys­tem sei­ne 166 MB Haupt­spei­cher genom­men hat und even­tu­ell noch etwas RAM für die im Hin­ter­grund lau­fen­den Anwen­dun­gen. Um die­se Zahl zu bestim­men, ver­wen­den Sie die fol­gen­de Syn­tax:

DeviceTotalMemory.Text =
   DeviceStatus.DeviceTotalMemory.ToString();

Application Current Memory Usage (long)

Bei Anwen­dun­gen, die einen signi­fi­kan­ten Haupt­spei­cher­ver­brauch haben, ist es wich­tig, den aktu­ell ver­wen­de­ten Spei­cher im Blick zu haben. Die Gren­ze liegt bei 90MB — es ist also wich­tig, sicher­zu­stel­len, dass die­se Gren­ze nicht über­schrit­ten wird. Um den aktu­el­len Haupt­spei­cher­ver­brauch der Anwen­dung fest­zu­stel­len, schrei­ben Sie:

ApplicationCurrentMemoryUsage.Text =
   DeviceStatus.ApplicationCurrentMemoryUsage.ToString();

Application Memory Usage Limit (long)

Wenn Sie eine Haupt­spei­cher­hung­ri­ge Anwen­dung ent­wi­ckeln, ist es wich­tig, die­se Zahl im Auge zu behal­ten. App­li­ca­ti­onMe­mo­ryU­sa­geL­imit ist das Maxi­mum an zusätz­li­chem Haupt­spei­cher, den ihr der­zei­ti­ger Anwen­dungs­pro­zess ver­wen­den kann. Die­ser Wert wird zurück­ge­ge­ben als die Anzahl an ver­füg­ba­ren Bytes:

ApplicationMemoryUsageLimit.Text =
   DeviceStatus.ApplicationMemoryUsageLimit.ToString();

Application Peak Memory Usage (long)

Eine wei­te­re Eigen­schaft im Zusam­men­hang mit Spei­cher­ma­nage­ment ist die Eigen­schaft, die es Ihnen erlaubt, die Ver­brauchs­spit­ze fest­zu­stel­len. Wenn Sie die bei­den vor­an­ge­gan­ge­nen Eigen­schaf­ten beob­ach­tet haben, wis­sen Sie die­sen Wert viel­leicht bereits schon. Der Wert ist den­noch eine wert­vol­le Infor­ma­ti­on wenn Sie Ihre Anwen­dung debug­gen. Um die­sen Wert zu zu bekom­men, ver­wen­den Sie den fol­gen­den Code:

ApplicationPeakMemoryUsage.Text =
   DeviceStatus.ApplicationPeakMemoryUsage.ToString();

Is Keyboard Present (boolean)

Es mag albern erschei­nen, die­se Eigen­schaft zu prü­fen. Es gibt jedoch vie­le Grün­de, war­um es wich­tig sein könn­te, ob der Benut­zer eine phy­si­ka­li­sche Tas­ta­tur hat oder nicht. Sie könn­ten die Tas­ta­tur bei­spiels­wei­se als Game­pad ver­wen­den oder als Aus­wahl­but­tons bei einem „Wer wird Millionär“-artigen Spiel. Mit dem Wis­sen um die zusätz­li­che Hard­ware lässt sich die­se in viel­fäl­ti­ger Wei­se nut­zen. Um auf die­sen Wert zuzu­grei­fen, schrei­ben Sie:

IsKeyboardPresent.Text =
   DeviceStatus.IsKeyboardPresent.ToString();

Ich wür­de ger­ne erfah­ren, wie Sie die­se Infor­ma­ti­on ver­wen­den wür­den. Wenn Sie eine Idee für die Ver­wen­dung der Tas­ta­tur haben, las­sen Sie es mich in den Kom­men­ta­ren wis­sen (Anm. leit­ning: Wenn Sie tat­säch­lich eine Idee haben, soll­ten Sie die­se mög­li­cher­wei­se direkt bei Jeffs Blog pos­ten).

Is Keyboard Deployed (boolean)

Deploy­ed“ mag ein etwas hoch­tra­ben­der Begriff sein für eine aus­ge­fah­re­ne Tas­ta­tur. Wie auch immer, die­se Eigen­schaft erlaubt uns fest­zu­stel­len, ob der Benut­zer sei­ne Tas­ta­tur aus­ge­fah­ren hat. Wie schon die Infor­ma­ti­on, ob das Gerät über­haupt eine Tas­ta­tur hat, ist die­se Infor­ma­ti­on sicher für Spe­zi­al­fäl­le inter­es­sant. Soll­ten der Zustand der Hard­ware­tas­ta­tur in Ihrer Anwen­dung eine Rol­le spie­len, schrei­ben Sie:

IsKeyboardDeployed.Text =
   DeviceStatus.IsKeyboardDeployed.ToString();

Da sich die­ser Wert jeder­zeit ändern kann, kön­nen wir ihn mit­tels eines Event Hand­lers beob­ach­ten. Dazu defi­nie­ren wir einen Event Hand­ler beim Start der Anwen­dung, etwa so:

DeviceStatus.KeyboardDeployedChanged += 
   new EventHandler(DeviceStatus_KeyboardDeployedChanged);

In der eigent­li­chen Metho­de zur Behand­lung des Events fra­gen wir ein­fach wie­der den Wert der obi­gen Eigen­schaft ab. Der ein­zi­ge Unter­schied ist, dass die­se Abfra­ge auf dem UI Thread aus­ge­führt wer­den muss. Um das zu tun eig­net sich fol­gen­der Code:

void DeviceStatus_KeyboardDeployedChanged(object sender, EventArgs e)
{
   Dispatcher.BeginInvoke(() => 
      {   
         IsKeyboardDeployed.Text =
            DeviceStatus.IsKeyboardDeployed.ToString()
      });
} 

Power Source (object)

Power Source ist mög­li­cher­wei­se die wert­volls­te Infor­ma­ti­on in der gan­zen Lis­te. Das Wis­sen, ob das Tele­fon gera­de ans Lade­ka­bel ange­schlos­sen ist oder ob es auf Akku läuft, ermög­licht Ihnen die Akti­vi­tä­ten Ihrer Anwen­dung zu pla­nen. Eine Men­ge neu­er Bil­der her­un­ter­zu­la­den wenn das Gerät den Akku ver­wen­det, ist mög­li­cher­wei­se nicht die bes­te Idee. Umge­kehrt könn­te es schwie­rig sein, vom Benut­zer zu ver­lan­gen, den Acce­le­ro­me­ter in einem Spiel zu ver­wen­den, wenn er am Lade­ka­bel hängt. Es gibt vie­le Grün­de, die aktu­el­le Strom­quel­le zu wis­sen und so geht’s:

PowerSource.Text = DeviceStatus.PowerSource.ToString();

Ähn­lich wie die Eigen­schaft IsKey­board­De­ploy­ed kann sich der Wert von Power­Sour­ce jeder­zeit ändern. Erstel­len Sie einen Event Hand­ler:

DeviceStatus.PowerSourceChanged += 
   new EventHandler(DeviceStatus_PowerSourceChanged);

Auch die Metho­de für die­sen Event erfor­dert Thread-Sicher­heit. Wir ver­wen­den also wie­der die Metho­de Dispatcher.BeginInvoke um die Benut­zer­ober­flä­che zu aktua­li­sie­ren:

void DeviceStatus_PowerSourceChanged(object sender, EventArgs e)
{
    Dispatcher.BeginInvoke(() => PowerSource.Text = DeviceStatus.PowerSource.ToString());
} 

Zusammenfassung

Die Klas­se Device­Sta­tus lie­fert uns eine Fül­le von wert­vol­len Infor­ma­tio­nen über das Gerät des Benut­zers. Dabei ist die Infor­ma­ti­on gera­de noch vage genug, um nicht zu wert­voll zu sein. Jede der Eigen­schaf­ten hat ihren eige­nen Nut­zen und ihre spe­zi­el­len Anwen­dungs­fäl­le und unter den rich­ti­gen Umstän­den wird ein Ent­wick­ler sehr dank­bar sein, dass die­se Infor­ma­tio­nen über das Gerät des Anwen­ders ver­füg­bar sind.

Als eine klei­ne Vor­schau auf auf die Anwen­dung, die wir gera­de ent­wi­ckelt haben, ist hier ein Screen­shot des Win­dows Pho­ne Emu­la­tors:

Um den Code als lauf­fä­hi­ges Pro­jekt her­un­ter­zu­la­den und auf ihrem eige­nen Tele­fon aus­zu­pro­bie­ren, kli­cken Sie auf das Visu­al Stu­dio Sym­bol unten. Jeder Arti­kel in der Serie wird ein beglei­ten­des Code­bei­spiel haben. Laden Sie den Code her­un­ter und pro­bie­ren Sie ihn aus um das behan­del­te The­ma kom­plett zu durch­drin­gen!

Mor­gen tau­chen wir ein in ein wesent­lich anwen­der­freund­li­che­res The­ma: Alar­me und Erin­ne­run­gen. Ich wer­de Ihnen genau zei­gen, wie Sie Erin­ne­run­gen set­zen kön­nen, auch wenn Ihre Anwen­dung nicht aus­ge­führt wird. Bis dahin!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.