BlackBerry 应用程序开发者指南 第二卷:高级--第6章 访问电话应用程序


作者:Confach 发表于2006-04-28 22:21 pm
版权信息:可以任意转载, 转载时请务必以超链接形式标明文章原始出处 和作者信息.
http://www.cnblogs.com/confach/articles/387949.html

6

          第6 访问电话应用程序



电话API

监听电话事件

访问和管理电话记录

电话API

电话API((net.rim.blackberry.api.phone)可以访问电话应用程序的高级特性,例如允许应用程序将DTMF(双声多频)的音调(tone)到活动的通话中.
:为了简单调用电话应用程序和拨打一个电话,使用调用API(net.rim.blackberry.api.invoke),为获得更多信息,参看83业的启动应用程序”. 当应用程序第一次访问电话API,检查一个 NoClassDefFoundError.如果系统管理员通过应用程序控制限制访问HTTP过滤器API,将抛出此错误. 为获得更多信息,参看BlackBerry应用程序开发者指南 2:高级 1:基础.

接收一个电话

调用Phone.getActiveCall()接收一个活动的电话.根据电话ID获取一个电话, 调用 Phone.getCall(int).

PhoneCall call = Phone.getActiveCall();

获取电话信息

PhoneCall类提供方法使应用程序获取电话的信息.例如,下面的代码检验电话的通话时间,电话的状态,以及在显示来电显示消息之前它是否正在出去.

int threshold = 120; // Alert user if outgoing calls last longer than threshold.

int elapsedTime = call.getElapsedTime();

// Use getStatusString() to retrieve status as an string.

int status = call.getStatus();

if ((status == PhoneCall.STATUS_CONNECTED ||

       status == PhoneCall.STATUS_CONNECTING) && call.isOutGoing()

       && elapsedTime > threshold) {

    // Use getCallId() to retrieve the caller ID as as an integer.

    String phoneNumber = call.getDisplayPhoneNumber();

    Status.show("Your call to " + phoneNumber + " has lasted more than " +

           (String)threshold + ".");

}

DTMF音调增加到发送队列中

一个DTMF音调由在同一时间里播放的高低频率组成.

低音

高音

1

697

1209

2

697

1336

3

697

1477

4

770

1209

5

770

1336

6

770

1477

7

852

1209

8

852

1336

9

852

1477

0

941

1209

*

941

1336

#

941

1477

 

将单个DTMF音调加入到发送队列中

:如果没有其他音调加入时,BlackBerry设备播放DTMF,同时覆写对话.

调用sendDTMFTone().

将多个DTMF音调加入到发送队列中

调用sendDTMFTones().

为当前电话获取发送队列

调用getDTMFTones().

监听电话事件

PhoneListener接口的实现使应用程序可以监听电话的事件.

调用Phone.addPhoneListener()方法向系统注册你的实现.

为了注销一个电话监听者,调用removePhoneListener().

为了完成一个指定的事件,实现下面的方法. 

方法

描述

callAdded(int)

当一个电话加入到一个会议电话时调用.

callAnswered(int)

当用户接听电话时调用(需用户驱动).

callConferenceCallEstablished(int)

当建立好一个电话会议时调用.

callConnected(int)

当网络指定一个连接事件时调用(网络驱动).

callDirectConnectConnected(int)

当一个直线电话(Direct-connect call)连接时调用

callDirectConnectDisconnected(int)

当一个直线电话断开时调用.

callDisconnected(int)

当断开一个电话时调用.

callEndedByUser(int)

当用户中止通话时调用.

callFailed(int, int)

当电话失败时调用.

callHeld(int)

当出去的电话锁住时调用.

callIncoming(int)

当一个新电话进来时调用.

callInitiated(int)

BlackBerry设备初始化一个出去的电话时调用.

callRemoved(int)

当一个电话从会议电话里断开时调用.

callResumed(int)

当一个锁住的电话重启时调用.

callWaiting(int)

当一个电话正在等待时调用.

conferenceCallDisconnected(int)

.当会议电话中止时调用.(所有的成员都断开).

访问和管理电话日志

电话记录API(net.rim.blackberry.api.phone.phonelogs)允许应用程序访问电话应用程序记录文件.电话呼叫记录包含每个单独电话的记录,它们分组到一个电话日志里.
: 应用程序第一次访问电话日API,检查一个 NoClassDefFoundError.如果系统管理员通过应用程序控制限制访问电话日志,将抛出此错误. 为获得更多信息,参看BlackBerry应用程序开发者指南 2:高级 1:基础.

获取一个电话日志

PhoneLogs类代表一个电话历史记录.它提供方法允许你打开,增加,删除,或交换呼叫记录.

>调用honeLogs.getInstance().

PhoneLogs _logs = PhoneLogs.getInstance

 

获取文件夹的电话呼叫数

电话日志分成2个文件夹: FOLDER_NORMAL_CALLS FOLDER_MISSED_CALLS.

>调用 numberOfCalls(int).

int numberOfCalls = _logs.numberOfCalls(FOLDER_NORMAL_CALLS);

获取一个呼叫记录

你可以实例化2种类型的呼叫记录: PhoneCallLog对象,它仅可以有一个参与者,以及ConferencePhoneCallLog对象,它有2个或多个参与者.2个对象可以使你获取或改变呼叫记录信息,例如参与者或呼叫日期.

>调用 PhoneLogs.callAt(int index, long folderID).

PhoneCallLog phoneLog = (PhoneCallLog)_logs.callAt(0);

获取一个电话参与者

PhoneCallLogID类根据电话号码标志电话里的参与者.

>调用 PhoneCallLog.getParticipant(int) ConferencePhoneCallLog.getParticipantAt().

PhoneCallLogID participant = phoneCallLog.getParticipant();

PhoneCallLogID participant = ConferencePhoneCallLog.getParticipant();

获取电话号码类型

PhoneCallLogID类为日志标志了电话的类型.例如,记录在地址本里的Home(家庭),Mobile(移动),Work(工作)Fax(传真).

>调用PhoneCallLogID.getType().

String phoneType = PhoneCallLogID.getType();

创建一个呼叫记录或会议电话记录

: PhoneCallLogID构造函数删除了电话号码里的短横以及其他非数字的字符

创建一个PhoneCallLogConferencePhoneCallLog对象的实例

为电话的构造函数提供日期,持续时间,参与者,以及留言参数

Date date = new Date("1000"); // date of call

int duration = 60; // duration of call

PhoneCallLogID caller1 = new PhoneCallLogID("555-1234"); // first participant

PhoneCallLogID caller2 = new PhoneCallLogID("555-1235"); // second participant

String notes = "New call."; // notes

ConferencePhoneCallLog conferenceCall =

    new ConferencePhoneCallLog(date, duration, PhoneLogs.FOLDER_NORMAL_CALLS,

           caller1, caller2, notes);

 

将电话加入到电话日志的下一个可用的索引上

>调用PhoneLogs.addCall(CallLog call).

_logs.addCall(conferenceCall);

用新呼叫记录代替给定索引的呼叫记录

>调用 PhoneLogs.swapCall(CallLog call,int index,long folderID).

_logs.swapCall(conferenceCall, 0, FOLDER_NORMAL_CALLS);

: swapCall()方法删除给定索引的呼叫记录..

删除一个呼叫记录

>调用 PhoneLogs.deleteCall().

_logs.deleteCall(0);

代码实例

下面的代码实例计算某个给定的参与者拨打电话的时间.


: PhoneLogsDemo.java

/**

* PhoneLogsDemo.java

* Copyright (C) 2001-2005 Research In Motion Limited. All rights reserved.

*/

package com.rim.samples.docs.phonelogs;

import net.rim.blackberry.api.phone.phonelogs.*;

import java.lang.*;

import com.rim.samples.docs.baseapp.*;

import net.rim.device.api.system.Application;

 

public class PhoneLogsDemo extends Application {

    private PhoneLogs _logs;

    private int _timeSpokenTo;

    static public void main(String[] args) {

       PhoneLogsDemo app = new PhoneLogsDemo();

       app.enterEventDispatcher();

    }

   

    private PhoneLogsDemo() {

       _logs = PhoneLogs.getInstance();

       PhoneLogsDemo phoneLogsDemo = new PhoneLogsDemo();

       PhoneCallLogID participant = new PhoneCallLogID("5551234");

       _timeSpokenTo = phoneLogsDemo.findTimeSpokenTo(participant,

              PhoneLogs.FOLDER_NORMAL_CALLS);

       }

    // Returns the number of seconds spent on the phone with a participant.

    public int findTimeSpokenTo(PhoneCallLogID participant,

           long folder) {

       int numberOfCalls = this._logs.numberOfCalls(folder);

       int timeSpokenTo = 0;

       PhoneCallLog phoneCallLog;

       ConferencePhoneCallLog conferencePhoneCallLog;

       for (int i = 0; i < numberOfCalls; i++) {

           Object o = _logs.callAt(i, folder);

           if (o instanceof PhoneCallLog) {

              phoneCallLog = (PhoneCallLog)_logs.callAt(i, folder);

              if ( phoneCallLog.getParticipant() == participant)

                  timeSpokenTo += phoneCallLog.getDuration();

              }

           else {

              conferencePhoneCallLog = (ConferencePhoneCallLog)_logs.callAt(i, folder);

              int participants = conferencePhoneCallLog.numberOfParticipants();

              for (int j = 0; j < participants; j++)

                  if (conferencePhoneCallLog.getParticipantAt(j) == participant) {

                     timeSpokenTo += conferencePhoneCallLog.getDuration();

                     j = participants;

                     }

              }

           }

       return timeSpokenTo;

       }

    }

Last Updated:2007年1月31日
posted @ 2006-04-28 22:21  张太国  阅读(2987)  评论(0编辑  收藏  举报