モバイル チュートリアル:モバイル デバイスで電話ダイヤラを使用する(iOS および Android)
目次
モバイル チュートリアル:モバイル アプリケーション開発(iOS および Android) への移動
このチュートリアルでは、モバイル デバイス上で電話ダイヤル サービスを使用する基本的な手順を説明します。
モバイル デバイス上の電話ダイヤル サービスについて
モバイル プラットフォームでは、TPhoneDialerService などの電話ダイヤル サービス クラスの構造を定義した IFMXPhoneDialerService インターフェイスが FireMonkey に用意されています。
電話ダイヤル サービスを利用すると、以下の操作を実行できます。
- 通信事業者(キャリア)に関する情報の取得
- 電話の発信
- 通話状態の変化の検出
電話ダイヤル サービスへのアクセス
電話ダイヤル サービスを使用するアプリケーションを作成するには、以下の基本手順を実行します。
- 次のいずれかを選択します。
- Delphi の場合:[ファイル|新規作成|マルチデバイス アプリケーション - Delphi]
- C++ の場合: [ファイル|新規作成|マルチデバイス アプリケーション - C++Builder]
- コード エディタを開き、以下を行います。
- 次の行がコードに含まれていない場合には追加します。
uses
FMX.Platform, FMX.PhoneDialer;
#include <FMX.Platform.hpp>
#include <FMX.PhoneDialer.hpp>
- Delphi アプリケーションの場合のみ: フォーム定義の public セクションに次の行を追加します。
constructor Create(AOwner: TComponent); override;
- フォーム定義の private セクションに次のプロパティを追加します。
private: // User declarations
PhoneDialerService: IFMXPhoneDialerService;
private: //User declarations
_di_IFMXPhoneDialerService phoneDialerService;
bool serviceSupported;
- Delphi アプリケーションの場合のみ: implementation セクションで、フォームのコンストラクタを次のようにオーバーライドします。
constructor TForm1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
TPlatformServices.Current.SupportsPlatformService(IFMXPhoneDialerService, IInterface(PhoneDialerService));
end;
- C++Builder アプリケーションの場合のみ:[構造]ビューでフォームをクリックし、[オブジェクト インスペクタ]で[イベント]タブを開いて、onCreate をダブルクリックします。アプリケーション フォームの onCreate イベント ハンドラを次のように実装します。
void __fastcall TForm1::FormCreate(TObject *Sender)
{
serviceSupported = (TPlatformServices::Current->SupportsPlatformService(__uuidof(IFMXPhoneDialerService)) &&
(phoneDialerService = TPlatformServices::Current->GetPlatformService(__uuidof(IFMXPhoneDialerService))));
}
これで、アプリケーションから電話ダイヤル サービスにアクセスできるようになりました。
ユーザー インターフェイスの設計
このチュートリアルでは、TLabel、TButton、TEdit の各コンポーネントをユーザー インターフェイス要素として使用します。
これらの UI 要素をセットアップするには、以下の手順を実行します。
- フォーム デザイナに TLabel コンポーネントを 2 つドロップしたあと、それらの Name プロパティをそれぞれlblCarrierName と lblISOCountryCode に設定します。
- これらのラベルの Text プロパティをそれぞれ Carrier Name と ISO Country Code に設定します。
- フォーム デザイナに TButton コンポーネントをドロップし、[オブジェクト インスペクタ]でこのボタンの以下のプロパティを設定します。
通信事業者プロパティの取得
通信事業者に関する情報を取得するには、以下の変更を加えます。
- フォーム デザイナで[Get Carrier Info]ボタンを選択します。
- [オブジェクト インスペクタ]で onClick イベントの入力フィールドをダブルクリックし、onClick イベントのイベント ハンドラを次のように実装します。
procedure TForm1.btnGetCarrierInfoClick(Sender: TObject);
begin
{ test whether the PhoneDialer services are supported on your device }
if Assigned(PhoneDialerService) then
begin
{ if yes, then update the labels with the retrieved information }
lblCarrierName.Text := 'Carrier Name: ' + PhoneDialerService.GetCarrier.GetCarrierName;
lblISOCountryCode.Text := 'ISO Country Code: ' + PhoneDialerService.GetCarrier.GetIsoCountryCode;
end;
end;
void __fastcall TForm1::btnGetCarrierInfoClick(TObject *Sender)
{
if (serviceSupported) {
lblCarrierName->Text = "Carrier Name: " + phoneDialerService->GetCarrier()->GetCarrierName();
lblISOCountryCode->Text = "ISO Country Code: " + phoneDialerService->GetCarrier()->GetIsoCountryCode();
} else ShowMessage("This device does not support the Phone Dialer services.");
}
アプリケーションの実行
重要: Delphi アプリケーションを Android デバイスで実行する前に、[すべての構成 - Android プラットフォーム]ターゲットに以下の権限が設定されていることを[プロジェクト|オプション...|使用する権限]で確認します。
- [電話の自動発信]
- [電話機能の状態の読み取り]
詳細は、「[使用する権限]」を参照してください。
アプリケーションを実行するには、[実行|実行]を選択するか F9 キーを押します。
[Get Carrier Info]ボタンをクリックすると、アプリケーションには通信事業者についての基本情報が以下のように表示されます。
iOS | Android |
---|---|
電話の発信
FireMonkey には、指定された電話番号に電話をかける IFMXPhoneDialerService.Call メソッドが用意されています。
アプリケーションから電話をかけるには、以下の要素をフォーム デザイナに追加します。
- TLabel コンポーネントを追加し、その Text プロパティを「Telephone Number」に設定します。
- TEdit コンポーネントを追加し、[オブジェクト インスペクタ]で以下のプロパティを設定します。
- Name を「edtTelephoneNumber」に設定。
- KillFocusByReturn を True に設定。
- KeyboardType を PhonePad に設定。
- ReturnKeyType を Go に設定。
- TButton コンポーネントを追加し、[オブジェクト インスペクタ]で以下を行います。
procedure TForm1.btnMakeCallClick(Sender: TObject);
begin
{ test whether the PhoneDialer services are supported on your device }
if Assigned(PhoneDialerService) then
begin
{ if the Telephone Number is entered in the edit box then make the call, else
display an error message }
if edtTelephoneNumber.Text <> '' then
PhoneDialerService.Call(edtTelephoneNumber.Text)
else
begin
ShowMessage('Please type-in a telephone number.');
edtTelephoneNumber.SetFocus;
end;
end;
end;
void __fastcall TForm1::btnMakeCallClick(TObject *Sender)
{
if (serviceSupported) {
if (edtTelephoneNumber->Text != "" ) {
phoneDialerService->Call(edtTelephoneNumber->Text);
}
else {
ShowMessage("Please type-in a telephone number.");
edtTelephoneNumber->SetFocus();
}
} else ShowMessage("This device does not support the Phone Dialer services.");
}
電話をかけるには:
- アプリケーションを実行します。
- [Telephone Number]フィールド(TEdit オブジェクト)に電話番号を入力します。
- [Make Call]ボタンをクリックします。
iOS | Android |
---|---|
通話状態の変化の検出
IFMXPhoneDialerService インターフェイスには、通話状態の変化を処理するのに使用できる OnCallStateChanged イベントが用意されています。TCallState 列挙型は、電話の取り得る通話状態を記述したものです。
TCallState 列挙型に定義されている項目を以下の表で説明します(各プラットフォームでサポートされている状態を "+" で示しています)。
項目 | 説明 | iOS | Android |
---|---|---|---|
None | 通話状態がありません。 | + | - |
Connected | 電話をかけた側が受けた側に接続されています。 | + | + |
Incoming | 電話が着信しています。 | + | + |
Dialing | 電話はダイヤル中の状態です。 | + | - |
Disconnected | 通話が切断されました。 | + | + |
OnCallStateChanged イベント ハンドラの実装
OnCallStateChanged イベントのイベント ハンドラを実装するには、以下の手順を実行します。
-
フォーム定義の private セクションに次の手続きヘッダーを追加します。
Delphi の場合:
procedure MyOnCallStateChanged(const ACallID: String; const ACallState: TCallState);
C++ の場合:
void __fastcall MyOnCallStateChanged(const UnicodeString aCallID, const TCallState aCallState);
-
「電話ダイヤル サービスへのアクセス」セクションで定義したフォームのコンストラクタ(Delphi アプリケーションの場合)または onFormCreate イベント ハンドラ(C++ アプリケーションの場合)を、次のように書き換えます。
Delphi の場合:
constructor TForm1.Create(AOwner: TComponent); begin inherited Create(AOwner); TPlatformServices.Current.SupportsPlatformService(IFMXPhoneDialerService, IInterface(PhoneDialerService)); if Assigned(PhoneDialerService) then PhoneDialerService.OnCallStateChanged := MyOnCallStateChanged; end;
C++ の場合:
void __fastcall TForm1::FormCreate(TObject *Sender) { serviceSupported = (TPlatformServices::Current->SupportsPlatformService(__uuidof(IFMXPhoneDialerService)) && (phoneDialerService = TPlatformServices::Current->GetPlatformService(__uuidof(IFMXPhoneDialerService)))); if (serviceSupported) { phoneDialerService->OnCallStateChanged = MyOnCallStateChanged; } }
- フォーム デザイナに TLabel コンポーネントを追加し、[オブジェクト インスペクタ]でその Name プロパティを「lblCallState」に設定します。
-
コード エディタで、次のイベント ハンドラ コードを追加します。
Delphi の場合:
procedure TForm1.MyOnCallStateChanged(const ACallID: String; const ACallState: TCallState); var outText: String; Begin case ACallState of TCallState.None: outText := 'No calls'; TCallState.Connected: outText := 'Connected'; TCallState.Incoming: outText := 'Incoming call'; TCallState.Dialing: outText := 'Dialing'; TCallState.Disconnected: outText := 'Disconnected'; end; lblCallState.Text := outText; End;
C++ の場合:
void __fastcall TForm1::MyOnCallStateChanged(const UnicodeString aCallID, const TCallState aCallState) { switch (aCallState) { case TCallState::None: lblCallState->Text = "No calls"; break; case TCallState::Connected: lblCallState->Text = "Connected"; break; case TCallState::Incoming: lblCallState->Text = "Incoming call"; break; case TCallState::Dialing: lblCallState->Text = "Dialing"; break; case TCallState::Disconnected: lblCallState->Text = "Disconnected"; break; } }
このイベント ハンドラをいったん実装すると、アプリケーションには電話の通話状態が表示されます。
たとえば、次の iOS 画面は、電話がダイヤル中の状態にある様子を示しています。
メモ: このサンプル プロジェクトでは、通話状態を示す TLabel コンポーネントは、[Telephone Number]の下の TEdit ボックスおよび[Make Call]ボタンの横にあります。
関連項目
- モバイル チュートリアル:写真を撮って共有する、テキストを共有する(iOS および Android)
- モバイル チュートリアル:位置センサを使用する(iOS および Android)
- Android モバイル アプリケーション開発
- iOS モバイル アプリケーション開発
- モバイル サンプル コード: PhoneDialer
- FMX.PhoneDialer.IFMXPhoneDialerService