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构造函数删除了电话号码里的短横以及其他非数字的字符
创建一个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日
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号