UWP: Kontakte in einer App schreiben, lesen und
erweitern.
Wenn man in der Windows 10 Universal App Kontakte erweitern
möchte ohne den ContactPicker zu verwenden, dann benötigt man den Zugriff zu den
Kontakten des Windows 10 Systems.
Im gezeigten Beispiel werden Kontakte aus der AVM Fritzbox
ermittelt und in die Windows 10 Contacts importiert. Der Vorgang geht für
Windows 10 Desktop und Mobile Versionen.
Diesen Zugriff bekommt man dadurch, dass man unter der Datei
Package.appxmanifest die Funktion: Kontaktpersonen aktiviert.
Beschreibung:
Bietet die Möglichkeit zum Aufführen der Aggregate auf dem Telefon. Mit dieser
Funktion kann ihre App auf alle verknüpften Kontakte zugreifen und eine
Übersicht über die Person bereitstellen.
Kontakte als Funktion in der App einbauen:
Wird beschrieben unter:
https://msdn.microsoft.com/library/windows/apps/xaml/mt270968.aspx
Die contacts-Funktion
ermöglicht den Zugriff auf die aggregierte Ansicht der Kontakte aus
verschiedenen Kontaktspeichern. Mit dieser Funktion erhält die App
eingeschränkten Zugriff (dabei gelten Regeln für Netzwerkberechtigungen) auf
Kontakte, die mit verschiedenen Netzwerken synchronisiert wurden, und auf den
lokalen Kontaktspeicher.
Die contacts-Funktion
muss den uap-Namespace enthalten, wenn sie im App-Paketmanifest wie
unten dargestellt deklariert wird.
XML
<Capabilities>
<uap:Capability Name="contacts"/>
</Capabilities>
|
ContactStore
Bevor man auf die Kontakte zugreifen kann, sollte man mit
dem Contactmanager den ContactStore mit
Schreib Leserechten erstellen.
//< Kontrolle.Zugriff Kontakte >
//ContactList contactList =
Windows.ApplicationModel.Contacts.ContactList;
//if this is throwing Access Denied, you haven't
declared the contacts capability in the manifest
ContactStore contactStore = await ContactManager.RequestStoreAsync(ContactStoreAccessType.AppContactsReadWrite);
if (contactStore == null)
{
//Could not open the
contacts store because the user denied you in settings, sorry!
MessageDialog connectionWarning =
new MessageDialog("The app needs
access to your contacts in order to function correctly. " + "Please grant it
access using the options in the settings menu ", "Lost Connection to
Store");
await
connectionWarning.ShowAsync();
//you should probably ask
the user before taking him/her to the settings page, but ya know, sample
await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-contacts"));
return;
}
//</ Kontrolle.Zugriff Kontakte >
|
ContactLists
ermitteln
Bei Windows 10 Contacts arbeitet man eigentlich immer mit
der eigenen Kontaktliste der App.
Hierzu erstellt man beim ersten mal eine neue ContactList
und gibt dieser einen Namen passend zur App.
Auf diese sollte man eigentlich dann immer vollen Zugriff
haben und hieraus Contact Element erstellen und löschen können.
Leider geht das Überschreiben von contacts zur Zeit 02/2016
noch nicht ohne Probleme (Schreibrechte)
//< aktuelle Kontakt-Liste >
//< alle ContactLists ermitteln >
IReadOnlyList<ContactList> contactLists = await contactStore.FindContactListsAsync();
//</ alle ContactLists ermitteln >
//< A: Listen loeschen >
//*und spaeter neu erstellen
foreach (ContactList delete_List in contactLists)
{
await delete_List.DeleteAsync();
}
//</ A: Listen loeschen >
ContactList contactList =null;
//< neue Liste erstellen >
if (contactLists.Count == 0)
{
contactList = await
contactStore.CreateContactListAsync("FritzBox");
}
//</ neue Liste erstellen >
//--< nach bestehender Liste suchen >--
//*funktioniert beim speichern von Contact noch
nicht wegen schreibschutz
else
{
foreach (ContactList check_ContactList in contactLists)
{
if(check_ContactList!=null)
{
if (check_ContactList.DisplayName == "FritzBox")
{
contactList = await
contactStore.GetContactListAsync(check_ContactList.Id);
break;
}
}
}
if (contactList == null)
{
//contactList =
contactLists.FirstOrDefault();
contactList = await
contactStore.CreateContactListAsync("FritzBox");
}
}
//--</ nach bestehender Liste suchen >--
//</ aktuelle Kontakt-Liste >
|
Contacts
Auf die Kontakte greift man über die ContactList und kann
hier über await
contactList.SaveContactAsync(newContact); Kontakte speichern
Nach dem aktuellen Stand 02/2016 besteht leider noch ein
Schreibrechte Problem sobald man über Windows 10 UWP universal App einen
Contact speichern möchte
//------< Neue Kontakte eintragen >------
try
{
//----< @Loop: alle
Zeilen ausgeben >----
foreach (tblRowDef_Kontakte row in _listTelefon)
{
//< Contact Fritzbox
>
string sName = row.Kontakt_Name;
string sTelefonNummer =
row.Kontakt_Nummer;
//string contactID =
"fritzBox_" + sTelefonNummer;
//</ Contact Fritzbox
>
//--< Check Existing Contact
>--
//*by Phone-Number
//< Find-Contacts >
IReadOnlyList<Contact> contacts = await
contactStore.FindContactsAsync(sTelefonNummer); //
//</ Find-Contacts >
if (contacts.Count > 0)
{
//----< Contact_Exits >----
//*check rename
foreach (Contact contact in contacts)
{
//Debug.WriteLine("Name="
+ contact.DisplayName + ":" + contact.Id + " , Number=" +
contact.Phones[0].Number );
if (contact.DisplayName ==
sName )
{
//< Contact aendern und
speichern >
//Contact oldContact =
await contactStore.GetContactAsync(contact.Id);
//await
contactList.DeleteContactAsync(oldContact);
//oldContact.Name = sName;
//await
contactList.SaveContactAsync(oldContact);
//}
//</ Contact aendern und
speichern >
}
}
//----</ Contact_Exits >----
}
else
{
//----< No_Contact_Exits >----
//< create Contact >
Contact newContact=new Contact();
//</ create Contact >
newContact.Name = sName;
ContactPhone contactPhone = new ContactPhone();
contactPhone.Number = sTelefonNummer;
newContact.Phones.Add(contactPhone);
Debug.WriteLine("Name=" + sName + " " + sTelefonNummer);
//< save contact >
await contactList.SaveContactAsync(newContact);
//</ save contact >
//----</ No_Contact_Exits >----
}
//--</ Check Existing
Contact >--
}
//--</ @Loop: alle
Zeilen ausgeben >--
//------</ Neue Kontakte
eintragen >------
|