Posodabljanje na najnovejšo različico (Windows Phone)

wp_ss_20140809_0033Ta članek je namenjen kot hiter vodič za posodabljanje Windows Phone naprave na najnovejšo uradno različico. Je tudi drugi del člankov celotnega vodiča, kako priti iz WP 8.1 dev preview s Lumia Black na WP 8.1 Update 1 dev preview s Lumia Cyan.

Drugi članki:

  1. Razveljavljanje “Developer Preview” posodobitve (samo za Lumia naprave)
  2. Posodabljanje na najnovejšo različico
  3. Posodabljanje na “Developer Preview”
  4. Factory Reset in obnavljanje podatkov (Windows Phone)

 

Read the rest of this entry »

Vektorski diamanti

Prejšnji vikend na //publish/ Hackathonu v Brežicah sem želel narediti igro, kjer sestavni del igre so diamanti. Kot mentor nisem imel veliko časa za izdelavo igre in sem raje izdelal fitnes aplikacijo Heart rate sensor for Zephyr HxM (že v WP trgovini). Preden sem šel na to aplikacijo, sem že naredil nekaj diamantov. Trenutno nimam časa za razvoj igre, če pa katerega zanimajo diamanti ali pa želi vedeti, kako enostavno narediti vektorske slike v XAML, je to pravi post.

image

XAML koda vseh likov je čisto spodaj.

Read the rest of this entry »

Moji viri učenja za razvoj v Windows 8 in Windows Phone 8

Tukaj je naštetih nekaj najbolj pomembnih virov znanja, ki jih jaz uporabljam za razvoj Windows 8 in Windows Phone 8.

Microsoft Virtual Academy

Za večino Microsoft platform priporočam portal Microsoft Virtual Academy, kjer imate veliko video vsebin lepo urejene po temah in težavnostih. Ta predavanja so narejena tako, da se hitro naučite osnove tehnologije in hkrati dobite nasvete od ljudi, ki že uporabljajo te tehnologije na svojih projektih. Nekateri seti predavanj so tudi vezani za MCT izpite in so bili moj glavni vir informacij za MCSD izpite za Windows Store using C#.
Read the rest of this entry »

Novosti Lumia Black posodobitve

Nekaj dni nazaj je prišla posodobitev Lumia Black. Zdaj si lahko namestite aplikacije iz prejšnjega posta Posodobitev Lumia Black. V tem postu vam bom predstavil le nekaj meni najbolj zanimivih novostih.

Glance 2.0

Glance 2.0 zdaj dodatno podpira še notification-e lockscreen-a, 3 barve pisave za nočni način in ob uri prikazuje stanja kot so tihi profil, vključeni alarmi in driving mode. Ozadje si lahko menjate s pomočjo Glance Background.

WP_20140111_14_58_41_Pro

Nastavitve Glance 2.0:

wp_ss_20140111_0001wp_ss_20140111_0002

In še slike nočnega načina v različnih barvah in stanji:

WP_20140111_17_49_03_ProWP_20140111_17_49_27_ProWP_20140111_17_50_10_ProWP_20140111_18_08_34_Pro

Folder App

Nokia nas je uspela presenetiti s novo zelo uporabno aplikacijo. Ta aplikacija vam omogoča ustvarjanje novih map, kjer shranite seznam aplikacij in jo pripnete na start zaslon.

wp_ss_20140112_0007wp_ss_20140112_0006wp_ss_20140112_0005

Aplikacija na WP Store: http://www.windowsphone.com/en-us/store/app/app-folder/7d2e7de3-95e7-4143-8a9d-aedf8c3f901e

Windows Phone GDR 3 posodobitve:

Nekaj zanimivih novosti je pa tudi v posodobitvi GDR 3, ki je na voljo za vse Windows Phone naprave.

Driving mode

To je nova funkcionalnost, ki vam omogoča avtomatično odgovarjanje klicev in SMS-ov s SMS-om in izključitev notificationov. Telefon avtomatično gre v driving mode ob povezavi na nastavljeno bluetooth slušalko. Notificationi so privzeto izključeni, da vas med vožnjo ne motijo.

wp_ss_20140112_0001wp_ss_20140112_0002wp_ss_20140112_0003wp_ss_20140112_0004

Ta aplikacija je nameščena v Settings.

Zapiranje aplikacij

V uporabniški vmesnik za preklop med aplikacijami so dodali možnost zapiranja aplikacij.

wp_ss_20140112_0010

 

Posodobitev GDR 3 in Lumia Black še imata kar nekaj novosti, a ti so se mi zdeli najbolj zanimivi. V roku nekaj mesecev bo že prišla še novejša posodobitev Windows Phone 8.1, ki bo prvič javnosti predstavljena v času //BUILD/ konference. (2.-4. april) Ta posodobitev bo največja od vseh posodobitev za Windows Phone, a več o tem drugič. Najverjetneje bodo razvijalci dobili razvijalsko različico posodobitve že aprila, za uporabnike pa bo na voljo nekaj tednov pozneje.

Pridobivanje informacij o Windows 8 napravi

Pridobivanje informacij o Windows 8 napravi je težje in bolj nepredvidljivo kot o Windows Phone 8 napravi (več v Pridobivanje informacij o Windows Phone napravi). Za večino informacij ne vemo, če so na voljo oz. kaj predstavljajo. Unikatni strojni ID se recimo lahko spremeni ob dodajanju ali odstranjevanju dodatnih naprav, nameščanje gonilnikov ali nameščanja orodij za virtualizacijo.

public static string GetHardwareUniqueID()
{
    var token = Windows.System.Profile.HardwareIdentification.GetPackageSpecificToken(null);
    IBuffer id = token.Id;
    byte[] bytes;

    using (var reader = DataReader.FromBuffer(id))
    {
        bytes = new byte[id.Length];
        reader.ReadBytes(bytes);
    }

    return BitConverter.ToString(bytes);
}

Priporočljiv način pridobivanja unikatnega ID-ja je generiranja GUID-a, vendar s to metodo na žalost ne morate zanesljivo ugotoviti ali je aplikacija že bila nameščena na to napravo. Ta ID tudi ni dostopen drugim aplikacijam.

public static string GetDeviceUniqueID()
{
    string key = "deviceID";
    var storage = ApplicationData.Current.LocalSettings.Values;
    if (storage.ContainsKey(key) && storage[key] is string)
    {
        return (string)storage[key];
    }

    string value = Guid.NewGuid().ToString();
    storage[key] = value;

    return value;
}

Z malo sprememb lahko dobite unikatni ID uporabnika. Namesto, da shranite GUID v lokalne nastavitve, jih shranite v roaming nastavitve. Ta podatek se prenaša med napravami, ampak uporabnik ima možnost odstraniti te podatke ob odstranjevanju aplikacije.

public static string GetUserUniqueID()
{
    string key = "userID";
    var storage = ApplicationData.Current.RoamingSettings.Values;
    if (storage.ContainsKey(key) && storage[key] is string)
    {
        return (string)storage[key];
    }

    string value = Guid.NewGuid().ToString();
    storage[key] = value;

    return value;
}

Zgornji dve kodi sta združljivi z Windows Phone 8 API-ji in jih lahko uporabite brez sprememb.

Za več informacij o napravi kot je npr. proizvajalec naprave, arhitektura procesorja in podobno, najdete tukaj:

http://attackpattern.com/2013/03/device-information-in-windows-8-store-apps/

Izdelava vektorskih slik za XAML razvijalce (1. del)

Včasih rabimo eno enostavno vektorsko sliko, ampak ne vemo od kod jo dobiti. Slike iz drugih virov ne moramo dovolj modificirati, da ustreza našim potrebam. Enostavne slike je mogoče sestaviti iz enostavnih oblik v XAML-u.

Prva ikona, ki jo bomo naredili, bo WiFi signal indikator. Ta je sestavljena iz 5 enako širokih štirikotnikov v obliki stopnic, ki jih ločujejo 4 prazni prostori. To ikono bomo naredili v dveh pristopih. V poznejših člankih bomo uporabljeno znanje izkoristili za bolj kompleksne primere.

Ikona iz enostavnih oblik

<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
    <Rectangle Fill="White" VerticalAlignment="Bottom" Width="50" Height="50" Margin="0,0,20,0" />
    <Rectangle Fill="White" VerticalAlignment="Bottom" Width="50" Height="100" Margin="0,0,20,0" />
    <Rectangle Fill="White" VerticalAlignment="Bottom" Width="50" Height="150" Margin="0,0,20,0" />
    <Rectangle Fill="White" VerticalAlignment="Bottom" Width="50" Height="200" Margin="0,0,20,0" />
    <Rectangle Fill="White" VerticalAlignment="Bottom" Width="50" Height="250" Margin="0,0,20,0" />
</StackPanel>

image

Ta rešitev je omejena le na specifično velikost. S pomočjo Viewbox kontrole lahko izboljšamo prilagodljivost na velikost.

<Viewbox>
    <!— WiFi XAML koda –>
</Viewbox>

Ikona s pomočjo razdeljevanja Grid-a in pozicioniranja Rectangle-ov

Nekatere ikone pa so preveč kompleksne, da bi jih lahko hitro naredili le s nekaj oblikami. Večino ikon, ki so sestavljene iz kvadratov, lahko sestavimo s pomočjo razdeljevanja Grid kontrole v vrstice in stolpce in Rectangle kontrole. Postopek je dolgotrajnejši, je pa zato bolj fleksibilen in včasih bistveno bolj enostaven.

Verticalna porazdelitev

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
</Grid>

image

Tukaj imamo 5 vrstic s enako velikostjo ne glede na višino. Višina posamezne vrstice je 1/5 celotne višine grida.

Horizontal porazdelitev

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="2*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="2*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="2*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="2*" />
    </Grid.ColumnDefinitions>
</Grid>

image

Tukaj imamo 9 stolpcev, razdeljeno po 5 stolpcev s dvojno velikost in med njimi so stolpci s enojno velikost. To pomeni, da je vsak lihi stolpec 2x večji od sodega stolpca.

Pozicioniranje Rectangle-a

Znotraj tega grida lahko elementom določimo Grid.Row, Grid.Column, Grid.RowSpan in Grid.ColumnSpan, ki se uporabljajo za pozicioniranje elementa znotraj starša (Grid kontrola). Index za Row in Column se začne s 0 in Row/ColumnSpan morata biti vsaj 1.

<Rectangle Fill="White" Grid.Row="3" Grid.Column="2" Grid.RowSpan="2" />

image

Končni rezultat

Primer celotnega dizajna za Wifi signal indikator s pomočjo razdeljevanja vrstic in stolpcev znotraj Grid-a.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="2*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="2*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="2*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="2*" />
    </Grid.ColumnDefinitions>

    <Rectangle Fill="White" Grid.Row="4" />
    <Rectangle Fill="White" Grid.Row="3" Grid.Column="2" Grid.RowSpan="2" />
    <Rectangle Fill="White" Grid.Row="2" Grid.Column="4" Grid.RowSpan="3" />
    <Rectangle Fill="White" Grid.Row="1" Grid.Column="6" Grid.RowSpan="4" />
    <Rectangle Fill="White" Grid.Column="8" Grid.RowSpan="5" />
</Grid>

image

Ta enostavna ikona načeloma ne potrebuje zadnje rešitve, saj nimamo veliko prednost pred prvim pristopom. V prihodnjem članku bo predstavljena malo bolj kompleksna ikona, kjer bo ta pristop bistveno lažji kot prvi pristop.

Pridobivanje informacij o Windows Phone napravi

Statični razred Microsoft.Phone.Info.DeviceExtendedProperties in Microsoft.Phone.Info.UserExtendedProperties imata veliko zanimivih informacij kot so ime proizvajalca, ime modela, unikatni ID naprave, unikatni ID uporabnika, itd.

Primer pridobivanja vrednosti podatkov:

public static T GetDeviceExtendedProperty<T>(string id)
{
    T result = default(T);
    object value;
    if (DeviceExtendedProperties.TryGetValue(id, out value) && value is T)
    {
        result = (T)value;
    }

    return result;
}

ID-ji za DeviceExtendedProperties:

  • DeviceManufacturer, string
  • DeviceName, string
  • DeviceFirmwareVersion, string
  • DeviceHardwareVersion, string
  • DeviceTotalMemory, long
  • ApplicationCurrentMemoryUsage, long
  • ApplicationPeakMemoryUsage, long
  • DeviceUniqueId, byte[] (potrebuje ID_CAP_IDENTITY_DEVICE)

UserExtendedProperties se uporablja za pridobivanje unikatnega uporabniškega ID-ja. Koda za pridobivanje tega ID je drugačna za Windows Phone 7 projekt (tudi na WP8 napravah) in za Windows Phone 8 projekt. To pomeni, da ko posodobite WP7 projekt na WP8 projekt, morate spremeniti za del kode. Za obe kodi potrebujete ID_CAP_IDENTITY_USER.

Za WP8:

string result = string.Empty;
object anid;
if (UserExtendedProperties.TryGetValue("ANID2", out anid))
{
    result = anid as string;
}

Za WP7:

const int AnidLength = 32;
const int AnidOffset = 2;

string result = string.Empty;
object anid;
if (UserExtendedProperties.TryGetValue(&quot;ANID&quot;, out anid))
{
    if (anid != null && anid.ToString().Length >= (AnidLength + AnidOffset))
    {
        result = anid.ToString().Substring(AnidOffset, AnidLength);
    }
}

Še izvorna koda, ki jo uporabljam v mojih projektih in preizkušeno deluje:

https://skydrive.live.com/redir?resid=D9E0BFCC79DE0D07!22989&authkey=!AOsk64Ld9KYLYgI&ithint=file%2c.cs