Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Como receber mensagens SMS em Symbian C++

From 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 05:18.
231 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×