电话监听
来源:互联网 发布:unity3d 画线 编辑:程序博客网 时间:2024/06/11 19:11
注:其中的DBGPRINTF()语句为日志输出语句。可以去掉。
//--------------------------------------------调用方式--------------------------------------------
1.先继承MCallsNotify,实例化NotifyCalls()
2.在.h文件中定义CTelephonyMonitor * iTelephonyMonitor;
3.在.cpp文件中创建
//电话监听,并打开
iTelephonyMonitor = CTelephonyMonitor::NewL(*this);
iTelephonyMonitor->StartMonitor();
4.在析构函数中释放iTelephonyMonitor
//--------------------------------------------TelephonyMonitor.h--------------------------------------------
/*
============================================================================
Name : TelephonyMonitor.h
Author :
Version :
Copyright : Your copyright notice
Description : CTelephonyMonitor declaration
============================================================================
*/
#ifndef TELEPHONYMONITOR_H
#define TELEPHONYMONITOR_H
#include <e32base.h>
#include <e32cmn.h>
#include <etel.h>
#include <Etel3rdParty.h>
//NetworkControl NetworkServices
//etel.lib
//etel3rdparty.lib
//消息引擎观察者类
class MCallsNotify
{
public:
virtual void NotifyCalls(const TDesC& aCallNumber) = 0;
};
class CTelephonyMonitor : public CActive
{
public:
static CTelephonyMonitor* NewL(MCallsNotify& aNotify);
//开始监控来电
void StartMonitor();
//停止监控来电
void StopMonitor();
//析构
~CTelephonyMonitor();
private:
CTelephonyMonitor(MCallsNotify& aNotify);
void ConstructL();
void GetPhoneNumber();
protected:
//处理来电事件(获取来电号码)
virtual void RunL();
virtual void DoCancel();
private:
CTelephony* iTelephony; //电话类
TBool iAnswerStatus; //是否接听电话,ETrue接听,EFalse不接听
HBufC* iCallerNumber;//来电号码
MCallsNotify* iCallsNotify; //回调指针
CTelephony::TCallStatusV1 iCurrentStatus;
CTelephony::TCallStatusV1Pckg iCurrentStatusPckg;
};
#endif
//--------------------------------------------TelephonyMonitor.cpp--------------------------------------------
/*
============================================================================
Name : TelephonyMonitor.cpp
Author :
Version :
Copyright : Your copyright notice
Description : CTelephonyMonitor implementation
============================================================================
*/
#include "manager/TelephonyMonitor.h"
#include <aknglobalnote.h>
#include <avkon.rsg>
#include <aknnotewrappers.h>
#include "manager/Log.h"
#define MEM_FREE(a) if(a){delete a; a=NULL;}
CTelephonyMonitor::CTelephonyMonitor(MCallsNotify& aNotify) :
CActive(EPriorityStandard), iCurrentStatusPckg(iCurrentStatus)
{
CActiveScheduler::Add(this);
iTelephony = NULL;
iCallerNumber = NULL;
iCallsNotify = &aNotify;
iCurrentStatus.iStatus = CTelephony::EStatusUnknown;
}
CTelephonyMonitor::~CTelephonyMonitor()
{
Cancel();
MEM_FREE(iCallerNumber);
MEM_FREE(iTelephony);
}
CTelephonyMonitor* CTelephonyMonitor::NewL(MCallsNotify& aNotify)
{
CTelephonyMonitor* pSelf = new (ELeave) CTelephonyMonitor(aNotify);
CleanupStack::PushL(pSelf);
pSelf->ConstructL();
CleanupStack::Pop(pSelf);
return pSelf;
}
void CTelephonyMonitor::ConstructL()
{
iTelephony = CTelephony::NewL();
}
//开始监控来电
void CTelephonyMonitor::StartMonitor()
{
//向服务器发出异步请求(当有来电时,请求完成调用RunL()获取号码)
iTelephony->NotifyChange(iStatus, CTelephony::EVoiceLineStatusChange,
iCurrentStatusPckg);
iAnswerStatus = EFalse;
//激活活动对象
SetActive();
}
//利用RunL()获取来电号码
void CTelephonyMonitor::RunL()
{
if (iStatus != KErrNone)
return;
switch (iCurrentStatus.iStatus)
{
case CTelephony::EStatusUnknown:
{
DBGPRINTF(_L("EStatusUnknown"));
}
break;
//来电没接:1来电中
//来电接通:1来电中
case CTelephony::EStatusRinging:
{
DBGPRINTF(_L("EStatusRinging"));
}
break;
//来电接通:2已经接通
case CTelephony::EStatusAnswering:
{
DBGPRINTF(_L("EStatusAnswering"));
}
break;
//拨打电话:1开始拨号
case CTelephony::EStatusDialling:
{
DBGPRINTF(_L("EStatusDialling"));
}
break;
//拨打电话:2开始连接
case CTelephony::EStatusConnecting:
{
DBGPRINTF(_L("EStatusConnecting"));
}
break;
//拨打电话:3连接完成
//来电接通:3连接完成
case CTelephony::EStatusConnected:
{
DBGPRINTF(_L("EStatusConnected"));
}
break;
//拨打电话:4正在断开
//来电没接:2连接中
//来电接通:4正在断开
case CTelephony::EStatusDisconnecting:
{
DBGPRINTF(_L("EStatusDisconnecting"));
}
break;
//拨打电话:5断开连接
//来电没接:3断开连接
//来电接通:5断开连接
case CTelephony::EStatusIdle:
{
DBGPRINTF(_L("EStatusIdle"));
}
break;
case CTelephony::EStatusReconnectPending:
{
DBGPRINTF(_L("EStatusReconnectPending"));
}
break;
case CTelephony::EStatusHold:
{
DBGPRINTF(_L("EStatusHold"));
}
break;
case CTelephony::EStatusTransferring:
{
DBGPRINTF(_L("EStatusTransferring"));
}
break;
case CTelephony::EStatusTransferAlerting:
{
DBGPRINTF(_L("EStatusTransferAlerting"));
}
break;
}
// 开始下一次监控
iTelephony->NotifyChange(iStatus, CTelephony::EVoiceLineStatusChange,
iCurrentStatusPckg);
SetActive();
}
//停止监听来电
void CTelephonyMonitor::StopMonitor()
{
Cancel();//此函数会调用DoCancel()
}
void CTelephonyMonitor::DoCancel()
{
iTelephony->CancelAsync(CTelephony::EVoiceLineStatusChangeCancel);
}
//获取来电号码
void CTelephonyMonitor::GetPhoneNumber()
{
CTelephony::TCallInfoV1 callInfoV1;
CTelephony::TCallInfoV1Pckg callInfoV1Pckg(callInfoV1);
CTelephony::TCallSelectionV1 callSelectionV1;
CTelephony::TCallSelectionV1Pckg callSelectionV1Pckg(callSelectionV1);
CTelephony::TRemotePartyInfoV1 remotePartyInfoV1;
CTelephony::TRemotePartyInfoV1Pckg remotePartyInfoV1Pckg(remotePartyInfoV1);
callSelectionV1.iLine = CTelephony::EVoiceLine;
callSelectionV1.iSelect = CTelephony::EInProgressCall;
User::LeaveIfError(iTelephony->GetCallInfo(callSelectionV1Pckg,
callInfoV1Pckg, remotePartyInfoV1Pckg));
MEM_FREE(iCallerNumber);
iCallerNumber = remotePartyInfoV1Pckg().iRemoteNumber.iTelNumber.AllocL();
}
//--------------------------------------------执行的流程--------------------------------------------
1.向外界拨打电话:
09:34:34 [Telephonymonitor.cpp 110] EStatusDialling
09:34:38 [Telephonymonitor.cpp 125] EStatusConnecting
09:34:38 [Telephonymonitor.cpp 130] EStatusConnected
09:35:15 [Telephonymonitor.cpp 140] EStatusDisconnecting
09:35:15 [Telephonymonitor.cpp 105] EStatusIdle
2.来电,但是没有接情况
10:02:23 [Telephonymonitor.cpp 115] EStatusRinging
10:02:27 [Telephonymonitor.cpp 140] EStatusDisconnecting
10:02:27 [Telephonymonitor.cpp 105] EStatusIdle
3.来电,接通
10:04:40 [Telephonymonitor.cpp 115] EStatusRinging
10:04:44 [Telephonymonitor.cpp 120] EStatusAnswering
10:04:44 [Telephonymonitor.cpp 130] EStatusConnected
10:04:56 [Telephonymonitor.cpp 140] EStatusDisconnecting
10:04:57 [Telephonymonitor.cpp 105] EStatusIdle
4.来电,接通,有新的电话打入
10:08:28 [Telephonymonitor.cpp 115] EStatusRinging
10:08:30 [Telephonymonitor.cpp 120] EStatusAnswering
10:08:30 [Telephonymonitor.cpp 130] EStatusConnected
10:08:44 [Telephonymonitor.cpp 140] EStatusDisconnecting
10:08:45 [Telephonymonitor.cpp 105] EStatusIdle
- 电话监听
- 监听电话
- 电话监听
- 电话监听
- Android 电话监听
- Ohone/android 监听电话
- 监听用户电话状态
- asterisk 电话监听ChanSpy()
- iPhone电话事件监听
- android 之电话监听
- Android-电话监听工具
- android 实现监听电话
- 拨出电话监听
- Android监听电话状态
- android 监听电话状态
- 如何监听电话
- android 监听电话状态
- 监听外拨电话
- linux 常用小命令二
- java 异常及异常使用总结
- WriteProcessMemory的一个细节
- [zz] mysql audit -访问日志记录
- 男人什么地方最优秀
- 电话监听
- 报表工具软件内置JS的使用之九
- Oracle 10g手工创建数据库个人经验
- web_concurrent_start
- 第一篇--徘徊
- Oracle数据库存储过程的6个问题
- c#中获取文件的后缀名
- C# Datediff (from:http://aspcode.net/c-datediff)
- 【转帖】暴雪CEO谈魔兽开发:研发团队要对项目有激情