请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

吾爱极客

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1053|回复: 0

移动设备上使用电话拨号器 (iOS和Android)

[复制链接]

271

主题

271

帖子

1129

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1129
发表于 2015-10-17 02:10:57 | 显示全部楼层 |阅读模式
这个教程描述了在移动设备上使用电话拨号器服务的基本步骤。

关于移动设备的电话拨号器服务

在移动平台上, FireMonkey 提供了 IFMXPhoneDialerService 接口定义电话拨号器服务类TPhoneDialerService的结构。

电话拨号器服务允许你完成以下操作:

    §  获取载体相关信息
    §  拨打电话
    §  检测呼叫状态变化。

访问电话拨号器服务

要创建一个使用电话拨号器的应用,完成以下基本步骤:

1.   选择:
    §  Delphi: File > New >Multi-DeviceApplication- Delphi
    §  C++: File > New >Multi-DeviceApplication- C++Builder

2.   打开代码编辑器,执行下面:
    §  (如果还没有的话)添加以下行:

       Delphi:
       uses
            FMX.Platform, FMX.PhoneDialer;

       C++:
           #include<FMX.Platform.hpp>
           #include<FMX.PhoneDialer.hpp>

    §  仅适用于Delphi应用:添加下面到窗体定义的public部分:

            constructor Create(AOwner: TComponent); override;

    §  添加以下属性到窗体定义的private 部分:

        Delphi:
             private: // User declarations
                    PhoneDialerService: IFMXPhoneDialerService;

        C++:
             private: //User declarations
                    _di_IFMXPhoneDialerService phoneDialerService;
                    bool serviceSupported;

    §  仅适用于Delphi应用:在实现部分,重窗体构造函数,如下:

        constructor TForm1.Create(AOwner: TComponent);
        begin
            inherited Create(AOwner);
            TPlatformServices.Current.SupportsPlatformService(IFMXPhoneDialerService, IInterface(PhoneDialerService));
        end;

    §  仅适用于C++应用:在Structure 视图, 点击窗体, 在Object Inspector()对象浏览器, 打开 Events 栏, 然后双击 onCreate。为应用的窗体实现onCreate 事件函数,如下:

        void __fastcall TForm1::FormCreate(TObject *Sender)
       {
              serviceSupported = (TPlatformServices::Current->SupportsPlatformService(__uuidof(IFMXPhoneDialerService)) &&
                          (phoneDialerService = TPlatformServices::Current-
              >GetPlatformService(__uuidof(IFMXPhoneDialerService))));
       }

现在应用可以访问电话拨号器服务了。


设计用户接口

本教程使用TLabel, TButton, 和 TEdit 控件作为用户接口元素。

要设置UI元素,执行以下步骤:

1.   拉两个TLabel 控件到窗体设计器, 分别设置他们的 Name 属性为 lblCarrierNamelblISOCountryCode

2.   分别设置label的 Text 属性为 Carrier NameISO Country Code

3.   在窗体设计器放置一个TButton 控件,在对象浏览器中设置按钮的以下属性:

    §  Name 为 btnGetCarrierInfo
    §  Text 为 Get Carrier Info


获取载体属性

要获取载体信息,作以下改变:

1.   在窗体设计器选择 Get Carrier Info 按钮。
2.   在对象浏览器,双击onClick 事件,实现 onClick 事件函数,如下:

Delphi:
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;

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 devicedoes not support the Phone Dialer services.");
}


运行应用

重要: 在Android设备上运行你的Delphi应用之前,核查下列权限已在Project > Options >Uses Permissions针对 All configurations - Android platform 目标设置。

    §  Call phone(拨打电话)
    §  Read phone state(读取电话状态)

要运行应用,选择 Run > Run 或按 F9

点击了Get Carrier Info之后,应用显示关于载体的基本信息,类似下图屏幕:
j53.PNG


拨打电话

FireMonkey 提供了 IFMXPhoneDialerService.Call 方法来拨打具体电话号码。
要在应用里拨打电话,添加以下元素到窗体设计器:

1.   添加一个 TLabel 控件,设置它的 Text 属性为Telephone Number.

2.   添加一个TEdit 控件, 在对象浏览器中设置以下属性:

    §  Name 为 edtTelephoneNumber.
    §  KillFocusByReturn 为 True.
    §  KeyboardType 为 PhonePad.
    §  ReturnKeyType 为 Go

3.   添加一个 TButton 控件, 在对象浏览器中,执行以下:

    §  设置 Name 属性为 btnMakeCall.
    §  设置 Text 属性为 Make Call.
    §  打开 Events 栏,双击 onClick, 实现onClick 事件函数如下:

       Delphi:
       procedure TForm1.btnMakeCallClick(Sender: TObject);
       begin
            { test whether thePhoneDialer services are supported on your device }
            if Assigned(PhoneDialerService) then
           begin
                { if the TelephoneNumber 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 atelephone 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-ina telephone number.");
                  edtTelephoneNumber->SetFocus();
               }
           }   else ShowMessage("This devicedoes not support the Phone Dialer services.");
    }

拨打电话:

1.    运行。

2.    在Telephone Number下面的TEdit字段,输入电话号码。

3.    点击Make Call按钮。
j54.PNG


检测呼叫状态改变

IFMXPhoneDialerService 接口提供了 OnCallStateChanged 事件来处理呼叫状态改变。TCallState 枚举描述了可能的呼叫状态。

下标列出了TCallState 枚举中的项目(每个平台支持的状态以"+"号标记).
  
项目
  
描述
iOS
Android
None
无呼叫状态
+
-
Connected
电话呼叫已经连接到被呼叫方
+
+
Incoming
来电呼叫
+
+
Dialing
电话正在拨号中
+
-
Disconnected
呼叫断开
+
+


实现以下OnCallStateChanged 事件函数

要实现 OnCallStateChanged 事件函数, 完成以下步骤:
添加以下过程定义行到窗体的private 部分:

procedure MyOnCallStateChanged(const ACallID: String; const ACallState: TCallState);

C++:
void __fastcall MyOnCallStateChanged(const UnicodeString aCallID, const TCallState aCallState);

1.    重写窗体构造函数(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;
       }
}

2.    添加一个 TLabel 控件到窗体设计器,在对象浏览器中设置它的 Name 属性为 lblCallState

3.    在代码编辑器,添加以下事件函数代码:

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截图表明电话正在拨号中。
j55.png

: 在这个例子项目中, TLabel 控件在TEdit 编辑框的旁边, Make Call 按钮在Telephone Number下面。


www.52jike.com(吾爱极客)  ruanzhuo翻译整理,转载请注明出处
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|吾爱极客 ( 粤ICP备15067754号-1  

GMT+8, 2018-6-25 17:34 , Processed in 0.166305 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表