×
Namespaces

Variants
Actions

Como receber mensagens SMS em Symbian C++

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

Exemplo de código
Artigo
Tradução:
Originado de SMS Receiver
Por maiconherverton
Última alteração feita por hamishwillee em 08 Dec 2011

O exemplo CSMSReceiver ilustra como você pode aguardar o recebimento de mensagens SMS e extrair informações a partir delas, logo após chegagem na caixa de entrada. Após construir o iSession no dentro da função ConstructL(), a função HandleSessionEventL() será chamada pelo SO para notificar sua classe nos eventos da 'CMsvSession'.

Conforme mostrado no exemplo, dentro dessa função somente o 'EMsvEntriesCreated' e 'EMsvEntriesMoved' são verificados após o código que verifica se o evento aconteceu para a caixa de entrada, após a função HandleEntryL() ser usada para manipular individualmente mensagens SMS. Você pode usar todas as funções definidas para o 'CBaseMtm' para extrair informações da mensagem (e você também poderia lançar a 'CBaseMtm' para 'CSmsClientMtm' para uma funcionalidade específica do SMS), com este exemplo, apenas o corpo da mensagem é enviada para a chamada da classe.

SMS_Receiver.cpp

CSMSReceiver* CSMSReceiver::NewL(MSMSRecCallBack& aObserver)
{
CSMSReceiver* self = new(ELeave)CSMSReceiver(aObserver);
self->ConstructL();
return self;
}
 
CSMSReceiver::CSMSReceiver(MSMSRecCallBack& aObserver):iObserver(aObserver)
{
}
 
CSMSReceiver::~CSMSReceiver()
{
delete iMtmRegistry;
iMtmRegistry = NULL;
 
delete iSession;
iSession = NULL;
}
 
void CSMSReceiver::ConstructL(void)
{
iSession = CMsvSession::OpenSyncL(*this);
iMtmRegistry = CClientMtmRegistry::NewL(*iSession);
}
 
 
void CSMSReceiver::HandleSessionEventL(TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* /*aArg3*/)
{
switch (aEvent)
{
case EMsvEntriesChanged:
{
}
break;
case EMsvEntriesCreated:
case EMsvEntriesMoved:
{
TMsvId* entryId;
entryId = static_cast<TMsvId*>(aArg2); // entrada do id da sessão do evento
if ( *entryId == KMsvGlobalInBoxIndexEntryId ) // nova entrada criada na pasta Recebidas (Inbox)
{
TMsvSelectionOrdering sort;
sort.SetShowInvisibleEntries(EFalse); // Não visualizamos
// Tira um handle da caixa de entrada
CMsvEntry* parentEntry = CMsvEntry::NewL(*iSession, KMsvGlobalInBoxIndexEntryId, sort);
CleanupStack::PushL(parentEntry);
 
CMsvEntrySelection* entries = static_cast<CMsvEntrySelection*>(aArg1);
if(entries)
{
//Processa cada entrada criada, uma por vez.
for(TInt i = 0; i < entries->Count(); i++)
{
HandleEntryL(entries->At(i));
}
}
 
CleanupStack::PopAndDestroy(1); // parentEntry
}
}
break;
case EMsvCloseSession:
{
iSession->CloseMessageServer();
}
break;
default:
{
// Todos os outros eventos são ignorados.
}
break;
}
}
 
void CSMSReceiver::HandleEntryL(TMsvId& aEntId)
{
CMsvEntry* entry = iSession->GetEntryL(aEntId);
CleanupStack::PushL(entry);
 
if(entry->Entry().iMtm == KUidMsgTypeSMS)
{
CBaseMtm* SmsMtm = iMtmRegistry->NewMtmL(KUidMsgTypeSMS);
if(SmsMtm)
{
CleanupStack::Pop(1);//Entrada
CleanupStack::PushL(SmsMtm);
SmsMtm->SetCurrentEntryL(entry);
SmsMtm->LoadMessageL();
 
HBufC* BodyBuffer = HBufC::NewLC(SmsMtm->Body().DocumentLength());
TPtr BodyPoint(BodyBuffer->Des());
 
SmsMtm->Body().Extract(BodyPoint,0,SmsMtm->Body().DocumentLength());
 
iObserver.GotSMSMessageL(*BodyBuffer);
 
CleanupStack::PopAndDestroy(2);//SmsMtm,BodyBuffer
}
else
{
CleanupStack::PopAndDestroy(1);//Entrada
}
}
else
{
CleanupStack::PopAndDestroy(1);//Entrada
}
}

SMS_Receiver.h

class MSMSRecCallBack 
{
public:
virtual void GotSMSMessageL(const TDesC& aMessage) = 0;
};
 
 
class CSMSReceiver : public CBase, MMsvSessionObserver
{
 
public:
static CSMSReceiver* NewL(MSMSRecCallBack& aObserver);
~CSMSReceiver();
protected:
CSMSReceiver(MSMSRecCallBack& aObserver);
void ConstructL(void);
void HandleSessionEventL(TMsvSessionEvent aEvent, TAny *aArg1, TAny *aArg2, TAny *aArg3);
private:
void HandleEntryL(TMsvId& aEntId);
private:
MSMSRecCallBack& iObserver;
CMsvSession* iSession;
CClientMtmRegistry* iMtmRegistry;
};

Se você estiver procurando por uma aplicação completa para esta funcionalidade, você pode olhar no um exemplo e apagar as entradas de log de mensagens SMS, especialmente para os Relatórios de entrega que também é ilustrada no exempplo File:SMS DeliveryReport Deleting.zip

Links relacionados:

This page was last modified on 8 December 2011, at 08:18.
81 page views in the last 30 days.
×