阻止来电
也就是3个步骤吧:初始化、监控、释放
初始化比较繁琐,TelServer、RPhone、RLine...要一级一级打开
Code:
TInt InitializePhone()
{
TInt theError;
RTelServer::TPhoneInfo phoneInfo;
RPhone::TLineInfo lineInfo;
User::LeaveIfError(theError = iTelServer.Connect());
// 获取TelServer中phone的数量
TInt numberPhones;
User::LeaveIfError(theError = iTelServer.EnumeratePhones(numberPhones));
GetDefaultTSYL(iTsyName); // 获取默认的Tsy模块名字
// Load in the phone device driver
User::LeaveIfError(theError = iTelServer.LoadPhoneModule(iTsyName));
// Get info about the first available phone
User::LeaveIfError(theError = iTelServer.GetPhoneInfo(0, phoneInfo));
// Use this info to open a connection to the phone, the phone is identified by its name
User::LeaveIfError(theError = iPhone.Open(iTelServer, phoneInfo.iName));
iPhone.Initialise();
// 获取phone中line的数量
TInt numLines;
theError = iPhone.EnumerateLines(numLines);
// 获取第一条通话线路
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;
}
}
return KErrNone;
}
// ---------------------------------------------------------
// void GetDefaultTSYL()
// ---------------------------------------------------------
void 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
}
然后是开始监控:
Code:
TInt StartObserver()
{
CActive::Cancel();
iLine.NotifyIncomingCall(iStatus, iName);
SetActive();
return ErrVal;
}
你只要在RunL()中放入n你的来电处理的代码,比如用RCall接通线路什么的,一旦有来电就会执行这些代码。当然了如果你希望能连续监测来电,别忘了在RunL中也调用StartObserver。
最后退出前别忘了释放资源:
// ---------------------------------------------------------
// void ReleasePhone()
// ---------------------------------------------------------
void ReleasePhone()
{
iLine.NotifyIncomingCallCancel();
iLine.Close();
iPhone.Close();
iTelServer.UnloadPhoneModule(iTsyName);
iTelServer.Close();
}