Como obter o estado atual de roaming e receber notificação sobre a mudança de rede
Dados do artigo
Platform Security
Tipo de assinatura requerido: DevCert or Symbian Signed
Capabilities: ReadDeviceData
Artigo
Tradução:
Por thiagobrunoms
Última alteração feita por hamishwillee
em 19 Dec 2011
O objetivo deste artigo é descobrir se o cartão SIM está em roaming ou na rede doméstica e receber notificação sobre cada mudança de rede. A aplicação deve ser "Symbian Signed", pois exige a utilização do ReadDeviceData. O programador deve usar um active object pois as chamadas são assíncronas. Abaixo está um exemplo de uma classe que recupera o status de registro por solicitação.
Cabeçalho necessário:
#include<etel3rdparty.h>Biblioteca necessária:
LIBRARY etel3rdparty.libNetRegister.h
#ifndef CNETREGISTER_H__
#define CNETREGISTER_H__
#include <Etel3rdParty.h>
//Enumeration para ter maior controle nas informações de status de registro inicial ou notificação de mudança de rede.
enum TNetStatus
{
EOperationNone,
ENetworkInitialRegInfo,
ENetworkChangeRegInfo
};
class CNetRegister : public CActive
{
public:
// construtor e destrutor estáticos
static CNetRegister* NewL();
~CNetRegister();
public:
void IssueRequest();
void GetNetworkRegistration();
protected: // de CActive
virtual void DoCancel();
virtual void RunL();
private: // construtores privados
CNetRegister();
void ConstructL();
private: // dados
CTelephony* iTelephony;
CTelephony::TNetworkRegistrationV1 iNetworkRegistrationV1;
CTelephony::TNetworkRegistrationV1Pckg iNetworkRegistrationV1Pckg;
TNetStatus iNetStatus;
};
#endif CNETREGISTER_H__
NetRegister.cpp
#include "NetRegister.h"
CNetRegister* CNetRegister::NewL()
{
CNetRegister* self = new (ELeave) CNetRegister();
CleanupStack::PushL(self);
self->ConstructL();
CleanupStack::Pop(); // self
return self;
}
CNetRegister::CNetRegister(): CActive(EPriorityHigh),iNetworkRegistrationV1Pckg(iNetworkRegistrationV1)
{
}
void CNetRegister::ConstructL()
{
iTelephony = CTelephony::NewL();
CActiveScheduler::Add(this);
GetNetworkRegistration();
}
CNetRegister::~CNetRegister()
{
Cancel();
delete iTelephony;
}
void CNetRegister::RunL()
{
if( iStatus == KErrNone )
{
switch(iNetStatus)
{
//Network registration changed notification.
case ENetworkChangeRegInfo:
{
CTelephony::TRegistrationStatus regStatus = iNetworkRegistrationV1.iRegStatus;
if(regStatus==CTelephony::ERegisteredRoaming)
{
//Rede alterada para Roaming
}
else if(regStatus==CTelephony::ERegisteredOnHomeNetwork)
{
//Rede alterada para Home network
}
}
break;
//Status inicial de registro de rede. Realiza pela primeira vez o status da rede tal como salvar os dados da rede etc.....
case ENetworkInitialRegInfo:
{
CTelephony::TRegistrationStatus regStatus = iNetworkRegistrationV1.iRegStatus;
if(regStatus==CTelephony::ERegisteredRoaming)
{
//Inicialmente no modo Roaming
}
else if(regStatus==CTelephony::ERegisteredOnHomeNetwork)
{
//Inicialmente no modo Home network
}
}
break;
default:
break;
}
}
else
{
// Captura erros
}
IssueRequest();
}
void CNetRegister::DoCancel()
{
iTelephony->CancelAsync(CTelephony::ENetworkRegistrationStatusChangeCancel);
iTelephony->CancelAsync(CTelephony::EGetNetworkRegistrationStatusCancel);
}
void CNetRegister::IssueRequest()
{
iNetStatus = ENetworkChangeRegInfo;
iTelephony->NotifyChange( iStatus,
CTelephony::ENetworkRegistrationStatusChange,
iNetworkRegistrationV1Pckg);
SetActive();
}
void CNetRegister::GetNetworkRegistration()
{
iNetStatus = ENetworkInitialRegInfo;
iTelephony->GetNetworkRegistrationStatus(iStatus, iNetworkRegistrationV1Pckg);
SetActive();
}


(no comments yet)