注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Simon

 
 
 

日志

 
 

symbian如何捕获电话接通与通话结束  

2010-06-16 02:10:54|  分类: Symbian C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
// cpp:

CPhoneCallNotifier::CPhoneCallNotifier():CActive(EPriorityHigh)
#ifdef SDK_S60_3RD
,iLineStatusPckg( iLineStatus ),iTelephony(NULL)
#endif
{
        iOpened = EFalse;
#ifdef SDK_S60_3RD
        iLineStatus.iStatus = CTelephony::EStatusUnknown;
#endif
}

CPhoneCallNotifier::~CPhoneCallNotifier()
{
        Cancel();
        if (iOpened)
                ReleasePhone();
}

CPhoneCallNotifier* CPhoneCallNotifier::NewL()
{
        CPhoneCallNotifier* self = new (ELeave) CPhoneCallNotifier();
        CleanupStack::PushL(self);
        self->ConstructL();
        CleanupStack::Pop(self);
        return self;
}

void CPhoneCallNotifier::ConstructL()
{
        InitializePhoneL();
        iOpened = ETrue;
        CActiveScheduler::Add(this); // Add to scheduler
        StartObserver();
}

TInt CPhoneCallNotifier::InitializePhoneL()
{
#ifdef SDK_S60_3RD
        iTelephony = CTelephony::NewL();
        return KErrNone;
#else
        TInt theError;
        RTelServer::TPhoneInfo phoneInfo;
        RPhone::TLineInfo lineInfo;

        User::LeaveIfError(theError = iTelServer.Connect());

        // 获取TelServer中phone的数量
        TInt numberPhones;
        theError = iTelServer.EnumeratePhones(numberPhones);
        if (theError != KErrNone){
                iTelServer.Close();
                User::Leave(theError);
        }

        TRAP(theError,GetDefaultTSYL(iTsyName)); // 获取默认的Tsy模块名字
        if (theError != KErrNone){
                iTelServer.Close();
                User::Leave(theError);
        }

        // Load in the phone device driver
        theError = iTelServer.LoadPhoneModule(iTsyName);
        if (theError != KErrNone){
                iTelServer.Close();
                User::Leave(theError);
        }
        // Get info about the first available phone
        theError = iTelServer.GetPhoneInfo(0, phoneInfo);
        if (theError != KErrNone){
                iTelServer.UnloadPhoneModule(iTsyName);
                iTelServer.Close();
                User::Leave(theError);
        }
        // Use this info to open a connection to the phone, the phone is identified by its name
        theError = iPhone.Open(iTelServer, phoneInfo.iName);
        if (theError != KErrNone){
                iTelServer.UnloadPhoneModule(iTsyName);
                iTelServer.Close();
                User::Leave(theError);
        }
        iPhone.Initialise();

        // 获取phone中line的数量
        TInt numLines;
        theError = iPhone.EnumerateLines(numLines);
        if (theError != KErrNone){
                iPhone.Close();
                iTelServer.UnloadPhoneModule(iTsyName);
                iTelServer.Close();
                User::Leave(theError);
        }


        // 获取第一条通话线路
        TInt i;
        for (i = 0; i < numLines; i++)
        {
                theError = iPhone.GetLineInfo(i, lineInfo);
                // 测试此线路是否属于可通话线路
                if (theError == KErrNone && (lineInfo.iLineCapsFlags & RLine::KCapsVoice))
                {
                        theError = iLine.Open(iPhone, lineInfo.iName); // 打开此线路
                        if (theError != KErrNone)
                                continue;
                        break;
                }
        }
        if (theError != KErrNone){
                iPhone.Close();
                iTelServer.UnloadPhoneModule(iTsyName);
                iTelServer.Close();
                User::Leave(theError);
        }
        return KErrNone;
#endif
}

// ---------------------------------------------------------
// void GetDefaultTSYL()
// ---------------------------------------------------------
#ifndef SDK_S60_3RD
void CPhoneCallNotifier::GetDefaultTSYL(TDes& aTSYName)
{
        CCommsDatabase* db = CCommsDatabase::NewL(EDatabaseTypeUnspecified);
        CleanupStack::PushL(db);

        CCommsDbTableView* table = db->OpenTableLC(TPtrC(MODEM));

        TInt tabErr = table->GotoFirstRecord();
        User::LeaveIfError(tabErr);

        TUint32 id;
        table->ReadUintL(TPtrC(COMMDB_ID), id);

        if (id == (TUint32)KDbNullColNo)
        {
                User::LeaveIfError(table->GotoNextRecord());
                table->ReadUintL(TPtrC(COMMDB_ID),id);
        }

        table->ReadTextL(TPtrC(MODEM_TSY_NAME), aTSYName);
        CleanupStack::PopAndDestroy(2); // table, db
}
#endif

void CPhoneCallNotifier::StartObserver()
{
        Cancel();
#ifdef SDK_S60_3RD
        iTelephony->NotifyChange( iStatus,
                              CTelephony::EVoiceLineStatusChange,
                              iLineStatusPckg );
#else
        iLine.NotifyStatusChange(iStatus, iCallStatus);
#endif
        SetActive();
}

void CPhoneCallNotifier::DoCancel()
{
#ifdef SDK_S60_3RD
        iTelephony->CancelAsync( CTelephony::EVoiceLineStatusChangeCancel );
#else
        iLine.NotifyStatusChangeCancel();
#endif
}

void CPhoneCallNotifier::RunL()
{
        //call is incoming,pause play
        if (iStatus == KErrNone){
#ifdef SDK_S60_3RD
                switch( iLineStatus.iStatus){
                case CTelephony::EStatusIdle:
                case CTelephony::EStatusUnknown:
                        AfxMsMainAppUi()->OnCallIdle();
                        break;
                default:
                        AfxMsMainAppUi()->OnInPhoneCall();
                        break;
                }
#else
                switch(iCallStatus){
                case RCall::EStatusIdle:
                case RCall::EStatusUnknown:
                        AfxMsMainAppUi()->OnCallIdle();
                        break;
                default:
                        AfxMsMainAppUi()->OnInPhoneCall();
                        break;
                }
#endif
        }
        StartObserver();
}

void CPhoneCallNotifier::ReleasePhone()
{
#ifdef SDK_S60_3RD
        delete iTelephony;
        iTelephony = NULL;
#else
        iLine.Close();
        iPhone.Close();
        iTelServer.UnloadPhoneModule(iTsyName);
        iTelServer.Close();
#endif
}




// ============= .h
#ifdef SDK_S60_3RD
#include <etel3rdparty.h>
#else
#include <etel.h>
#include <cdblen.h>
#include <commdb.h>
#endif
class CPhoneCallNotifier:public CActive
{
public:
        static CPhoneCallNotifier* NewL();
        CPhoneCallNotifier();
        ~CPhoneCallNotifier();
protected:
        void DoCancel();
        void RunL();
private:
        void ConstructL();
        TInt InitializePhoneL();
        void StartObserver();
        void ReleasePhone();
private:
        TBool                iOpened;
#ifdef SDK_S60_3RD
        CTelephony* iTelephony;
    CTelephony::TCallStatusV1 iLineStatus;
    CTelephony::TCallStatusV1Pckg iLineStatusPckg;
#else
        void GetDefaultTSYL(TDes& aTSYName);
        RTelServer iTelServer;
        RPhone                iPhone;
        RLine                iLine;
        TName                iName;
        RCall::TStatus iCallStatus;
        TBuf<KCommsDbSvrMaxColumnNameLength> iTsyName;
#endif
};










// ========== 用法:

创建来用就行了,看RunL,他会调用appui的公有函数。
  评论这张
 
阅读(573)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018