モバイル チュートリアル:アドレス帳コンポーネントを使用する(iOS および Android)

提供: RAD Studio
移動先: 案内検索

モバイル チュートリアル:モバイル アプリケーション開発(iOS および Android) への移動


このチュートリアルを開始する前に、次のチュートリアルを読んで実行することをお勧めします。

FireMonkey では、iOS デバイスおよび Android デバイスでアドレス帳を扱うための TAddressBook コンポーネントを提供しています。

このチュートリアルでは、TAddressBook コンポーネントを使った簡単な FireMonkey アプリケーションの作成方法を説明します。

iOS Android

AddressBook Apps.png
iPhone 5

AddressBook Android.png

Android(LG - E612)


TAddressBook コンポーネントの基本機能

モバイル プラットフォーム(Android と iOS)では、FireMonkey は、TAddressBook コンポーネントをサポートしており、アプリケーションはデバイスのアドレス帳にアクセスすることができます。このコンポーネントの基本機能は、次の通りです:

  • デバイスのアドレス帳にアクセスするリクエストを送信し、アクセス ステータスを取得します。
  • デバイスのアドレス帳で定義されているすべてのソースにアクセスします。
  • 指定されたソースから、すべてまたは個々のコンタクトをフェッチします。
  • 指定されたグループからすべてのコンタクトをフェッチします。
  • 既存の連絡先やグループを編集または削除できる。
  • 連絡先を新規作成できる。
  • 新しいグループの作成。

サンプル アプリケーションの作成

このセクションでは、TAddressBook コンポーネントの使い方を示すために、Android および iOS ターゲット プラットフォーム向けのサンプル アプリケーションを作成します。このアプリケーションを使って次の方法を説明します。

  • アドレス帳に対するアクセス権を要求する
  • デバイスのアドレス帳におけるデフォルトのソースから、すべてのコンタクトを取得します。
  • 新しい連絡先をアドレス帳に追加する
  • 選択した連絡先をアドレス帳から削除する

ユーザー インターフェイスの設計

  1. 以下を選択して、空のマルチデバイス アプリケーションを作成します。
    • Delphi の場合[ファイル|新規作成|マルチデバイス アプリケーション - Delphi|空のアプリケーション]
    • C++ の場合[ファイル|新規作成|マルチデバイス アプリケーション - C++Builder|空のアプリケーション]
  2. プロジェクト マネージャで、ターゲット プラットフォームを Android または iOS に設定します。
  3. [ツール パレット]で、TToolBarTAddressBook、および TListBox の各コンポーネントを選択し、フォーム デザイナにドロップします。
  4. [オブジェクト インスペクタ]で、TListBoxAlign プロパティを Client に設定します。
  5. フォーム デザイナTListBox を右クリックし、ショートカット メニューから[項目の追加|TSearchBox]を選択します。
  6. [ツール パレット]TMultiView コンポーネントを選択し、フォーム デザイナにドロップします。

アプリケーション ツールバーとマスタ ペインを設計する

コントロール要素はすべてツールバーとマスタ ペインに配置します。

  • ツールバーには次の 3 つのスピード ボタンを含めます。
    • Addre Trash.png: 選択した連絡先をアドレス帳から削除します。
    • Addr Refresh.png: 現在の連絡先リストを最新状態に更新します。
    • Addr Add.png: マスタ ペインを開き、新しい連絡先をアドレス帳に追加できるようにします。
  • マスタ ペインには、新しい連絡先を指定し、それをアドレス帳に追加するためのフォームを含めます。

アプリケーション ツールバーを設計するには:

  1. トップ ツールバーで、これら 3 つの TSpeedButton コンポーネントをドロップします。
  2. フォーム デザイナで以下の手順を実施します。
    • SpeedButton1 を選択し、Name プロパティを「btnRemove」に、StyleLookup プロパティを trashtoolbuttonordered に設定します。
    • SpeedButton2 を選択し、Name プロパティを「btnRefresh」に、StyleLookup プロパティを refreshtoolbuttonordered に設定します。
    • SpeedButton3 を選択し、Name プロパティを「btnAdd」に、StyleLookup プロパティを addtoolbuttonordered に設定します。

上記の手順を実施すると、フォーム デザイナは次の図のようになります。 AddressBook toolbar.png

マスタ ペインを設計するには:

  1. [構造]ビューMultiView1 を選択し、[オブジェクト インスペクタ]で次のプロパティを指定します。
    • MasterButton プロパティを btnAdd に設定します。
    • Mode プロパティを Drawer に設定します。
    • MultiView1 が表示されるよう Visible プロパティを True に設定します。
  2. [ツール パレット]から、3 つの TLabel コンポーネント、3 つの TEdit コンポーネント、および 2 つの TButton コンポーネントを Multiview1 にドロップします。
  3. [オブジェクト インスペクタ]で、MultiView1 に配置したコントロール要素のプロパティを次のように指定します。
    • Label1Label2Label3Text プロパティを、それぞれ「First name」、「Last name」、「Work mail」に設定します。
    • Edit1Edit2Edit3 に対して:
      • Name プロパティを edtFirstNameedtLastNameedtWorkMail にそれぞれ設定します。
      • KillFocusByReturn プロパティを true に設定します。
      • ReturnKeyType プロパティを Go に設定します。
    • Button1Button2 に対して:
      • Text プロパティを Add および Cancel に設定します。
      • Name プロパティを btnOK および btnCancel にそれぞれ設定します。

マスタ ペインのコントロール要素は、次のように配置することをお勧めします。

AddressBook Drawer.png

連絡先リストの取得

このセクションでは、デバイスのアドレス帳において、デフォルト ソースから連絡先リストを取得する方法を説明します。

アプリケーションでは、次の private メソッドを定義します:

  • FillContactsList: デバイスのアドレス帳からデフォルトのソースの連絡先リストを取得します。
  • AddListBoxItem: 新しい項目を ListBox に追加します。

アプリケーション コードの private セクションを次のように変更します。

Delphi の場合
private
    { Private declarations }
    procedure FillContactList;
    procedure AddListBoxItem(Contact: TAddressBookContact);
C++Builder の場合
private:	// User declarations
	void __fastcall FillContactsList();
        void __fastcall AddListBoxItem(TAddressBookContact *Contact);

FillContactslist および AddListBoxItem のメソッドを、次のように実装します:

Delphi の場合
// Fill the contact list
procedure TForm1.FillContactList;
var
  I: Integer;
  Contacts: TAddressBookContacts;
begin
  Contacts := TAddressBookContacts.Create;
  try
    AddressBook1.AllContacts(AddressBook1.DefaultSource, Contacts);
    ListBox1.BeginUpdate;
    try
      ListBox1.Clear;
      for I := 0 to Contacts.Count - 1 do
        AddListBoxItem(Contacts.Items[I]);
    finally
      ListBox1.EndUpdate;
    end;
  finally
    Contacts.Free;
  end;
end;
// --------------------------------------------------------------------
// Add a new contact to List box
procedure TForm1.AddListBoxItem(Contact: TAddressBookContact);
var
  ListBoxItem: TListBoxItem;
begin
  try
    ListBoxItem := TListBoxItem.Create(nil);
    ListBoxItem.Text := Contact.DisplayName;
    ListBoxItem.Tag := Contact.ID;
    ListBox1.AddObject(ListBoxItem);
  finally
    ListBoxItem.Free;
  end;
end;
C++Builder の場合
// Fill the List box with existed contact display names.
void __fastcall TForm1::FillContactsList() {
	int i;
	TAddressBookContacts *Contacts = new TAddressBookContacts(); 
	__try {
		AddressBook1->AllContacts(AddressBook1->DefaultSource(), Contacts);
		__try {
			ListBox1->BeginUpdate();
			ListBox1->Clear();
			for (i = 0; i < Contacts->Count; i++)
				AddListBoxItem(Contacts->Items[i]);

		}
		__finally {
			ListBox1->EndUpdate();
		}
	}

	__finally {
		Contacts->Free();
	}
}
// ---------------------------------------------------------------------------
// Add a new contact to List box
void __fastcall TForm1::AddListBoxItem(TAddressBookContact *Contact) {
    TListBoxItem *ListBoxItem = new TListBoxItem(ListBox1);

	__try {

		ListBoxItem->Text = Contact->DisplayName;
		ListBoxItem->Tag = Contact->ID;
		ListBox1->AddObject(ListBoxItem);
	}
	__finally {
		ListBoxItem->Free();
	}
}

コントロール要素の機能の実装

アプリケーション開発の最後に、アプリケーション フォームにドロップしたすべてのコントロール要素のイベント ハンドラを実装しなければなりません。

スピード ボタンの OnClick イベント ハンドラを実装するには:

  1. フォーム デザイナで、スピード ボタン(btnRefreshbtnRemove)をダブルクリックします。
  2. コード エディタで、それぞれのボタンのイベント ハンドラを以下のように指定します。
Delphi の場合
//-------------------For Remove button -----------------------------------------
procedure TForm1.btnRemoveClick(Sender: TObject);
var
  ContactIndex, ContactID: Integer;
  Contact: TAddressBookContact;
begin
  ContactIndex := ListBox1.ItemIndex;
  if (ContactIndex > -1) Then
  begin
    ContactID := ListBox1.ListItems[ContactIndex].Tag;
    Contact := AddressBook1.ContactByID(ContactID);
    if Contact <> nil then
      try
        AddressBook1.RemoveContact(Contact);
        ListBox1.BeginUpdate;
        ListBox1.Items.Delete(ContactIndex);
      finally
        ListBox1.EndUpdate;
        Contact.Free;
      end;
  end;
end;
// -------------------For Refresh button---------------------------------------
procedure TForm1.btnRefreshClick(Sender: TObject);
begin
  FillContactsList;
end;
C++Builder の場合
//-------------------For Remove button -----------------------------------------
// Remove the contact currently selected from the List box
void __fastcall TForm1::btnRemoveClick(TObject *Sender) {
	int ContactIndex = ListBox1->ItemIndex;
	if (ContactIndex > -1) {
		int ContactID = ListBox1->ListItems[ContactIndex]->Tag;
		TAddressBookContact *Contact = AddressBook1->ContactByID(ContactID);
		if (Contact != NULL) {
			__try {
				AddressBook1->RemoveContact(Contact);
				ListBox1->BeginUpdate();
				ListBox1->Items->Delete(ContactIndex);

			}
			__finally {
				ListBox1->EndUpdate();
				Contact->Free();

			}
		}
	}
}
// --------------------------For Refresh button-------------------------------------
void __fastcall TForm1::btnRefreshClick(TObject *Sender) {
	FillContactsList();
}

マスタ ペインのボタンの onClick イベント ハンドラを実装するには:

  1. [構造]ビューMultiView1 を選択します。
  2. [オブジェクト インスペクタ]Visible プロパティを True に設定します。
    これでマスタ ペインが表示されます。
  3. マスタ ペインで[Add]ボタンをダブルクリックし、イベント ハンドラを次のように実装します。
    • Delphi の場合
     
    // --------------------------------------------------------------------
    // Add a newly created contact to Address Book
    procedure TForm1.btnOKClick(Sender: TObject);
    var
      Contact: TAddressBookContact;
      eMails: TContactEmails;
      Addresses: TContactAddresses;
    
    begin
      Contact := AddressBook1.CreateContact(AddressBook1.DefaultSource);
      try
        Contact.FirstName := edtFirstName.Text;
        Contact.LastName := edtLastName.Text;
        // Add the work mail
        eMails := TContactEmails.Create;
        try
          eMails.AddEmail(TContactEmail.TLabelKind.Work, edtWorkMail.Text);
          Contact.eMails := eMails;
        finally
          eMails.Free;
        end;
        AddressBook1.SaveContact(Contact);
        try
          ListBox1.BeginUpdate;
          AddListBoxItem(Contact);
        finally
          ListBox1.EndUpdate;
        end;
      finally
        Contact.Free;
      end;
      MultiView1.HideMaster;
    
    end;
    
    • C++ の場合
    // Add a newly created contact to Address Book
    void __fastcall TForm1::btnOKClick(TObject *Sender) {
    
    	TContactEmails *eMails;
    	TAddressBookContact *Contact =
    		AddressBook1->CreateContact(AddressBook1->DefaultSource());
    
    	__try {
    
    		Contact->FirstName = edtFirstName->Text;
    		Contact->LastName = edtLastName->Text;
    	 // Add the work mail
    		eMails = new TContactEmails();
    		__try {
    			eMails->AddEmail(TContactEmail::TLabelKind::Work,
    			edtWorkMail->Text);
    			Contact->EMails = eMails;
    		}
    		__finally {
    			eMails->Free();
    		}
    		AddressBook1->SaveContact(Contact);
    		__try {
    			ListBox1->BeginUpdate();
    			AddListBoxItem(Contact);
    		}
    		__finally {
    			ListBox1->EndUpdate();
    		}
    
    	}
    	__finally {
    		Contact->Free();
    	}
    	MultiView1->HideMaster();	
    }
    
  4. マスタ ペインで[Cancel]ボタンをダブルクリックし、イベント ハンドラを次のように実装します。
    • Delphi の場合
     
    // Clear and close the Add New Contact form
    procedure TForm1.btnCancelClick(Sender: TObject);
    begin
      edtFirstName.Text := '';
      edtLastName.Text := '';
      edtWorkMail.Text := '';
      MultiView1.HideMaster;
    end;
    
    • C++ の場合
    // Clear and close the Add New Contact form
    void __fastcall TForm1::btnCancelClick(TObject *Sender)
    {
    	edtFirstName->Text = "";
    	edtLastName->Text = "";
    	edtWorkMail->Text = "";
    	MultiView1->HideMaster();
    }
    

アドレス帳の同期を維持する

アプリケーション実行中に、サードパーティ ツールがデバイスのアドレス帳に変更を加えることもあるでしょう。そのような状況では、デバイスの連絡帳と、アプリケーションが直接作業している連絡帳のインスタンスの間で、情報の同期がとれていることが重要になってきます。この用途のために、FireMonkey は TAddressBook.RevertCurrentChangesAndUpdate メソッドを提供しています。

アドレス帳の同期を維持するには:

  1. [オブジェクト インスペクタ]AddressBook1 を選択し、[イベント]タブを開きます。
  2. OnExternalChange の隣をダブルクリックし、次のイベント ハンドラを実装します。
    • Delphi の場合
     
    procedure TForm1.AddressBook1ExternalChange(ASender: TObject);
    begin
      AddressBook1.RevertCurrentChangesAndUpdate;
      FillContactsList;
    end;
    
    • C++ の場合
    void __fastcall TForm1::AddressBook1ExternalChange(TObject *ASender) {
    	AddressBook1->RevertCurrentChangesAndUpdate();
    	FillContactsList();
    }
    

アドレス帳に対するアクセス権の構成

TAddressBook を使用するには、アプリケーションがターゲットのモバイル デバイス上のアドレス帳にアクセスする権限を要求しなければなりません。

このセクションでは、ターゲットのモバイル デバイス上のアドレス帳にアクセスできるよう Android および iOS アプリケーションを構成する手順を説明します。

アドレス帳に対するアクセス権を要求するには:

  1. [オブジェクト インスペクタ]Form1 を選択し、[イベント]タブを開きます。
  2. onShow の隣をダブルクリックし、イベント ハンドラを次のように実装します。
    • Delphi の場合
     
    procedure TForm1.FormShow(Sender: TObject);
    begin
      // Display this information box while loading the contacts
      if AddressBook1.Supported then
      begin
        TDialogService.ShowMessage('Loading contacts...');
        AddressBook1.RequestPermission;
      end
      else
        ShowMessage('This platform does not support the Address Book service');
    
    end;
    
    • C++ の場合
    void __fastcall TForm1::FormShow(TObject *Sender) {
    	if (AddressBook1->Supported()) {
    	 // Display this information box while loading the contacts
    		TDialogService::ShowMessage("Loading contacts...");
    		AddressBook1->RequestPermission();
    	}
    	else {
    		TDialogService::ShowMessage
    			("This platform does not support the Address Book service.");
    	}
    }
    

    Note - TDialogService.ShowMessage メソッドを使用するには、自分のコードで次の手順が行われているか確認してください:

    Delphi
    uses
      FMX.DialogService;
    
    C++:
    #include <FMX.DialogService.hpp>
    
  3. [オブジェクト インスペクタ]AddressBook1 を選択し、[イベント]タブを開きます。
  4. OnPermissionRequest の隣をダブルクリックし、イベント ハンドラを次のように実装します。
    • Delphi の場合
     
    procedure TForm1.AddressBook1PermissionRequest(ASender: TObject;
      const AMessage: string; const AAccessGranted: Boolean);
    begin
     if AAccessGranted then
       Begin
          FillContactlist;     
       End
                       else
          ShowMessage('You cannot access Address Book. Reason: ' + AMessage);
    
    
    end;
    
    • C++ の場合
    void __fastcall TForm1::AddressBook1PermissionRequest(TObject *ASender,
    	const UnicodeString AMessage, const bool AAccessGranted) {
    
    	if (AAccessGranted) {
    		FillContactsList();
    
    	}
    	else {
    		ShowMessage("You cannot access Address Book. Reason: " + AMessage);
    	}
    }
    

アドレス帳にアクセスできるよう Android アプリケーションを構成する

TAddressBook コンポーネントを使用する Android アプリケーションを実行するには、プロジェクトの[使用する権限]をいくらか構成する必要があります。

[使用する権限]を構成するには:

  1. RAD Studio IDE で、[プロジェクト|オプション...|使用する権限]を開きます。
  2. 次の権限を有効にします:
    • アカウントの取得
    • 連絡先の読み込み
    • 連絡先の書き込み

サンプル アプリケーションの実行

このアプリケーションを以下のようにして実行します。

  1. [プロジェクト マネージャ]でターゲット プラットフォームを選択します(サポートされているプラットフォームは Android と iOS です)。

    重要: このアプリケーションを Android デバイスで実行するには、「アドレス帳にアクセスできるよう Android アプリケーションを構成する」の作業を事前に必ず行ってください。

  2. Shift+Ctrl+F9 を押して、デバッガを使わずにアプリケーションを実行します。

以下のシナリオを使ってアプリケーションをテストします。

アドレス帳に新しい連絡先を追加するには:

  1. アプリケーション ツールバーで Addr Add.png をタップします。
    これでマスタ ペインが開きます。
  2. マスタ ペインで、[First name][Last name][Work mail]のテキスト ボックスに適切な情報を入力します。それが終わったら、[Add]をタップして、新しく作成した連絡先をアドレス帳に追加します。

    Add Contact iOS.png



連絡先を削除するには:

  1. 連絡先リストで削除対象の連絡先をタップします。
  2. アプリケーション ツールバー上で: Addre Trash.png
    注目! これは、確認のためのプロンプトを出すことなく、連絡先をデバイスのアドレス帳から削除します。

    Remove Contact iOS.png

関連項目

コード サンプル