アプリを連絡先カードの操作に接続する

アプリは、連絡先カードまたはミニ連絡先カードのアクションの横に表示されます。 ユーザーは、アプリでプロファイル ページを開く、通話する、メッセージを送信するなどのアクションを実行することを選択できます。

連絡先カードとミニ連絡先カード

作業を開始するには、既存の連絡先を見つけるか、新しい連絡先を作成します。 次に、 説明 およびいくつかのパッケージ マニフェスト エントリを作成して、アプリがサポートするアクションを記述します。 次に、アクションを実行するコードを記述します。

より完全なサンプルについては、「 Contact Card Integration Sample」を参照してください。

連絡先を検索または作成する

アプリが他のユーザーとの接続に役立つ場合は、Windows で連絡先を検索し、注釈を付けます。 アプリで連絡先を管理している場合は、連絡先を Windows 連絡先リストに追加し、注釈を付けることができます。

連絡先を検索する

名前、メール アドレス、または電話番号を使用して連絡先を検索します。

ContactStore contactStore = await ContactManager.RequestStoreAsync();

IReadOnlyList<Contact> contacts = null;

contacts = await contactStore.FindContactsAsync(emailAddress);

Contact contact = contacts[0];

連絡先を作成する

アプリがアドレス帳に似ている場合は、連絡先を作成し、連絡先リストに追加します。

Contact contact = new Contact();
contact.FirstName = "TestContact";

ContactEmail email = new ContactEmail();
email.Address = "TestContact@contoso.com";
email.Kind = ContactEmailKind.Other;
contact.Emails.Add(email);

ContactPhone phone = new ContactPhone();
phone.Number = "4255550101";
phone.Kind = ContactPhoneKind.Mobile;
contact.Phones.Add(phone);

ContactStore store = await
    ContactManager.RequestStoreAsync(ContactStoreAccessType.AppContactsReadWrite);

ContactList contactList;

IReadOnlyList<ContactList> contactLists = await store.FindContactListsAsync();

if (0 == contactLists.Count)
    contactList = await store.CreateContactListAsync("TestContactList");
else
    contactList = contactLists[0];

await contactList.SaveContactAsync(contact);

各連絡先に注釈を付けます

各連絡先に、アプリで実行できるアクション (操作) の一覧 (ビデオ通話やメッセージングなど) にタグを付けます。

次に、連絡先の ID を、アプリがそのユーザーを識別するために内部的に使用する ID に関連付けます。

ContactAnnotationStore annotationStore = await
   ContactManager.RequestAnnotationStoreAsync(ContactAnnotationStoreAccessType.AppAnnotationsReadWrite);

ContactAnnotationList annotationList;

IReadOnlyList<ContactAnnotationList> annotationLists = await annotationStore.FindAnnotationListsAsync();
if (0 == annotationLists.Count)
    annotationList = await annotationStore.CreateAnnotationListAsync();
else
    annotationList = annotationLists[0];

ContactAnnotation annotation = new ContactAnnotation();
annotation.ContactId = contact.Id;
annotation.RemoteId = "user22";

annotation.SupportedOperations = ContactAnnotationOperations.Message |
  ContactAnnotationOperations.AudioCall |
  ContactAnnotationOperations.VideoCall |
 ContactAnnotationOperations.ContactProfile;

await annotationList.TrySaveAnnotationAsync(annotation);

各操作に登録する

パッケージ マニフェストで、注釈に一覧表示した操作ごとに登録します。

マニフェストの Extensions 要素にプロトコル ハンドラーを追加して登録します。

<Extensions>
  <uap:Extension Category="windows.protocol">
    <uap:Protocol Name="ms-contact-profile">
      <uap:DisplayName>TestProfileApp</uap:DisplayName>
    </uap:Protocol>
  </uap:Extension>
  <uap:Extension Category="windows.protocol">
    <uap:Protocol Name="ms-ipmessaging">
      <uap:DisplayName>TestMsgApp</uap:DisplayName>
    </uap:Protocol>
  </uap:Extension>
  <uap:Extension Category="windows.protocol">
    <uap:Protocol Name="ms-voip-video">
      <uap:DisplayName>TestVideoApp</uap:DisplayName>
    </uap:Protocol>
  </uap:Extension>
  <uap:Extension Category="windows.protocol">
    <uap:Protocol Name="ms-voip-call">
      <uap:DisplayName>TestCallApp</uap:DisplayName>
    </uap:Protocol>
  </uap:Extension>
</Extensions>

これらは、Visual Studio のマニフェスト デザイナーの Declarations タブに追加することもできます。

マニフェスト デザイナーの [宣言] タブ

連絡先カードのアクションの横にあるアプリを見つける

People アプリを開きます。 注釈とパッケージ マニフェストで指定した各アクション (操作) の横にアプリが表示されます。

連絡先カード

ユーザーがアクションのアプリを選択した場合、ユーザーが次回連絡先カードを開くと、そのアクションの既定のアプリとして表示されます。

ミニ連絡先カードでアクションの横にあるアプリを見つける

ミニ連絡先カードでは、アクションを表すタブにアプリが表示されます。

ミニ連絡先カード

Mailアプリなどのアプリは、ミニ連絡先カードを開きます。 アプリで開く場合もあります。 このコードでは、その方法を示します。

public async void OpenContactCard(object sender, RoutedEventArgs e)
{
    // Get the selection rect of the button pressed to show contact card.
    FrameworkElement element = (FrameworkElement)sender;

    Windows.UI.Xaml.Media.GeneralTransform buttonTransform = element.TransformToVisual(null);
    Windows.Foundation.Point point = buttonTransform.TransformPoint(new Windows.Foundation.Point());
    Windows.Foundation.Rect rect =
        new Windows.Foundation.Rect(point, new Windows.Foundation.Size(element.ActualWidth, element.ActualHeight));

   // helper method to find a contact just for illustrative purposes.
    Contact contact = await findContact("contoso@contoso.com");

    ContactManager.ShowContactCard(contact, rect, Windows.UI.Popups.Placement.Default);

}

ミニ連絡先カードのその他の例については、 連絡先カードのサンプルを参照してください。

連絡先カードと同様に、各タブには、ユーザーが最後に使用したアプリが記憶されるため、アプリに簡単に戻れます。

ユーザーが連絡先カードでアプリを選択したときに操作を実行する

App.cs ファイル内の Application.OnActivated メソッドをオーバーライドし、ユーザーをアプリ内のページに移動させます。 Contact Card Integration Sampleは、これを行う 1 つの方法を示しています。

ページの分離コード ファイルで、 Page.OnNavigatedTo メソッドをオーバーライドします。 連絡先カードは、このメソッドに操作の名前とユーザーの ID を渡します。

ビデオまたはオーディオの呼び出しを開始するには、次のサンプルを参照してください: VoIP サンプル。 完全な API は、 WIndows.ApplicationModel.Calls 名前空間にあります。

メッセージングを容易にするには、 Windows.ApplicationModel.Chat 名前空間を参照してください。

別のアプリを起動することもできます。 これがこのコードの機能です。

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    var args = e.Parameter as ProtocolActivatedEventArgs;
    // Display the result of the protocol activation if we got here as a result of being activated for a protocol.

    if (args != null)
    {
        var options = new Windows.System.LauncherOptions();
        options.DisplayApplicationPicker = true;

        options.TargetApplicationPackageFamilyName = "ContosoApp";

        string launchString = args.uri.Scheme + ":" + args.uri.Query;
        var launchUri = new Uri(launchString);
        await Windows.System.Launcher.LaunchUriAsync(launchUri, options);
    }
}

args.uri.scheme プロパティには操作の名前が含まれており、args.uri.Query プロパティにはユーザーの ID が含まれています。