モバイル チュートリアル:モバイル デバイスで電話ダイヤラを使用する(iOS および Android)

提供: Appmethod Topics
移動先: 案内検索

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


このチュートリアルでは、モバイル デバイス上で電話ダイヤル サービスを使用する基本的な手順を説明します。

モバイル デバイス上の電話ダイヤル サービスについて

モバイル プラットフォームでは、TPhoneDialerService などの電話ダイヤル サービス クラスの構造を定義した IFMXPhoneDialerService インターフェイスが FireMonkey に用意されています。

電話ダイヤル サービスを利用すると、以下の操作を実行できます。

  • 通信事業者(キャリア)に関する情報の取得
  • 電話の発信
  • 通話状態の変化の検出

電話ダイヤル サービスへのアクセス

電話ダイヤル サービスを使用するアプリケーションを作成するには、以下の基本手順を実行します。

  1. 次のいずれかを選択します。
  2. コード エディタを開き、以下を行います。
  • 次の行がコードに含まれていない場合には追加します。
Object Pascal の場合:
uses
  FMX.Platform, FMX.PhoneDialer;
C++ の場合:
#include <FMX.Platform.hpp>
#include <FMX.PhoneDialer.hpp>
  • Object Pascal アプリケーションの場合のみ: フォーム定義の public セクションに次の行を追加します。
 constructor Create(AOwner: TComponent); override;
  • フォーム定義の private セクションに次のプロパティを追加します。
Object Pascal の場合:
 private:	// ユーザー宣言
 PhoneDialerService: IFMXPhoneDialerService;
C++ の場合:
private:	// ユーザー宣言
_di_IFMXPhoneDialerService phoneDialerService;
bool serviceSupported;
  • Object Pascal アプリケーションの場合のみ: implementation セクションで、フォームのコンストラクタを次のようにオーバーライドします。
 constructor TForm1.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  TPlatformServices.Current.SupportsPlatformService(IFMXPhoneDialerService, IInterface(PhoneDialerService));
end;
  • C++ アプリケーションの場合のみ: [構造]ビューでフォームをクリックし、[オブジェクト インスペクタ][イベント]タブを開いて、onCreate をダブルクリックします。アプリケーション フォームの onCreate イベント ハンドラを次のように実装します。
void __fastcall TForm1::FormCreate(TObject *Sender)
{
        serviceSupported = (TPlatformServices::Current->SupportsPlatformService(__uuidof(IFMXPhoneDialerService)) &&
	                   (phoneDialerService = TPlatformServices::Current->GetPlatformService(__uuidof(IFMXPhoneDialerService))));
		
}

これで、アプリケーションから電話ダイヤル サービスにアクセスできるようになりました。

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

このチュートリアルでは、TLabelTButtonTEdit の各コンポーネントをユーザー インターフェイス要素として使用します。

これらの UI 要素をセットアップするには、以下の手順を実行します。

  1. フォーム デザイナに TLabel コンポーネントを 2 つドロップしたあと、それらの Name プロパティをそれぞれ「lblCarrierName」と「lblISOCountryCode」に設定します。
  2. これらのラベルの Text プロパティをそれぞれ「Carrier Name」と「ISO Country Code」に設定します。
  3. フォーム デザイナに TButton コンポーネントをドロップし、[オブジェクト インスペクタ]でこのボタンの以下のプロパティを設定します。
    • Name を「btnGetCarrierInfo」に設定
    • Text を「Get Carrier Info」に設定

通信事業者プロパティの取得

通信事業者に関する情報を取得するには、以下の変更を加えます。

  1. フォーム デザイナで[Get Carrier Info]ボタンを選択します。
  2. [オブジェクト インスペクタ]で onClick イベントの入力フィールドをダブルクリックし、onClick イベントのイベント ハンドラを次のように実装します。
Object Pascal の場合:
procedure TForm1.btnGetCarrierInfoClick(Sender: TObject);
begin
  { デバイスで PhoneDialer サービスがサポートされているかをテストする }
  if Assigned(PhoneDialerService) then
  begin
    { Yes の場合、取得した情報をラベルに反映する }
    lblCarrierName.Text := 'Carrier Name:  '  + PhoneDialerService.GetCarrier.GetCarrierName;
    lblISOCountryCode.Text := 'ISO Country Code: ' + PhoneDialerService.GetCarrier.GetIsoCountryCode;
  end;
end;
C++ の場合:
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.");

}

アプリケーションの実行

重要: Object Pascal アプリケーションを Android デバイスで実行する前に、[すべての構成 - Android プラットフォーム]ターゲットに以下の権限が設定されていることを[プロジェクト|オプション...|使用する権限で確認します。

  • [電話の自動発信]
  • [電話機能の状態の読み取り]


詳細は、「[使用する権限]」を参照してください。

アプリケーションを実行するには、[実行|実行を選択するか F9 キーを押します。

[Get Carrier Info]ボタンをクリックすると、アプリケーションには通信事業者についての基本情報が以下のように表示されます。

iOS Android

IOS CarrierInfo.png

Android CarrierInfo.png

電話の発信

FireMonkey には、指定された電話番号に電話をかける IFMXPhoneDialerService.Call メソッドが用意されています。

アプリケーションから電話をかけるには、以下の要素をフォーム デザイナに追加します。

  1. TLabel コンポーネントを追加し、その Text プロパティを「Telephone Number」に設定します。
  2. TEdit コンポーネントを追加し、[オブジェクト インスペクタ]で以下のプロパティを設定します。
  3. TButton コンポーネントを追加し、[オブジェクト インスペクタ]で以下を行います。
  • Name プロパティを「btnMakeCall」に設定
  • Text プロパティを「Make Call」に設定
  • [イベント]タブで onClick イベントの入力フィールドをダブルクリックし、onClick イベントのイベント ハンドラを次のように実装します。
Object Pascal の場合:
procedure TForm1.btnMakeCallClick(Sender: TObject);
begin
  { デバイスで PhoneDialer サービスがサポートされているかをテストする }
  if Assigned(PhoneDialerService) then
  begin
    { [Telephone Number]編集ボックスが入力されていれば電話をかける、されていなければエラー メッセージを表示する }

    if edtTelephoneNumber.Text <> '' then
      PhoneDialerService.Call(edtTelephoneNumber.Text)
    else
    begin
      ShowMessage('Please type-in a telephone number.');
      edtTelephoneNumber.SetFocus;
    end;
  end;
end;
C++ の場合:
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.");
}


電話をかけるには:

  1. アプリケーションを実行します。
  2. [Telephone Number]フィールド(TEdit オブジェクト)に電話番号を入力します。
  3. [Make Call]ボタンをクリックします。
iOS Android

IOS PhoneDialer.png

Android PhoneDialer.png

通話状態の変化の検出

IFMXPhoneDialerService インターフェイスには、通話状態の変化を処理するのに使用できる OnCallStateChanged イベントが用意されています。TCallState 列挙型は、電話の取り得る通話状態を記述したものです。

TCallState 列挙型に定義されている項目を以下の表で説明します(各プラットフォームでサポートされている状態を "+" で示しています)。

項目 説明  iOS  Android
None 通話状態がありません。 + -
Connected 電話をかけた側が受けた側に接続されています。 + +
Incoming 電話が着信しています。 + +
Dialing 電話はダイヤル中の状態です。 + -
Disconnected 通話が切断されました。 + +

OnCallStateChanged イベント ハンドラの実装

OnCallStateChanged イベントのイベント ハンドラを実装するには、以下の手順を実行します。

  1. フォーム定義の private セクションに次の手続きヘッダーを追加します。
    Object Pascal の場合:
     procedure MyOnCallStateChanged(const ACallID: String; const ACallState: TCallState);
    
    C++ の場合:
    void __fastcall MyOnCallStateChanged(const UnicodeString aCallID, const TCallState aCallState);
    
  2. 電話ダイヤル サービスへのアクセス」セクションで定義したフォームのコンストラクタ(Object Pascal アプリケーションの場合)または onFormCreate イベント ハンドラ(C++ アプリケーションの場合)を、次のように書き換えます。
    Object Pascal の場合:
     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;
           }
    }
    
  3. フォーム デザイナに TLabel コンポーネントを追加し、[オブジェクト インスペクタ]でその Name プロパティを「lblCallState」に設定します。
  4. コード エディタで、次のイベント ハンドラ コードを追加します。
    Object Pascal の場合:
    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 画面は、電話がダイヤル中の状態にある様子を示しています。

Ios PhoneCall State.png

メモ: このサンプル プロジェクトでは、通話状態を示す TLabel コンポーネントは、[Telephone Number]の下の TEdit ボックスおよび[Make Call]ボタンの横にあります。

関連項目