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)允许应用程序访问电话应用程序记录文件.电话呼叫记录包含每个单独电话的记录,它们分组到一个电话日志里.
获取一个电话日志
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构造函数删除了电话号码里的短横以及其他非数字的字符
创建一个PhoneCallLog或ConferencePhoneCallLog对象的实例
为电话的构造函数提供日期,持续时间,参与者,以及留言参数
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日