电话监听

来源:互联网 发布: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