Spanish Service para detectar un nuevo mensaje en la libreria POP 3

softmicro

Member
Licensed User
Longtime User
Es mi primera vez en el foro y me cuesta leer todos los comentarios en ingles.
He utilizado el service para detectar sms y procesar el contenido del mensaje.
He practicado con la libreria POP 3 y he tenido buenos resultados en el analisis de los datos contenidos en el mail recibido.
Sin embrago, si el programa de aplicacion esta en stand by , no lo "despierta" por que me falta un permiso y service para esa funcion. Como se haria eso?, similar al proceso de los sms pero con que permisos?
Cuando resumo el programa, recupero los mails en espera pero necesito que se en el momento de la deteccion.
Estoy en los inicios del tema. tal vez ya haya ejemplos de como implementarlo en algun foro en ingles. Gracias
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

Creo entender que cuando recibes algo en algun SMS, quieres reanudar la aplicacion.
Puedes hacer dos cosas, o avisas al usuario con una notificación desde el servicio, o creas una variable global que la activas desde el servicio y la lees desde el Activity_Resume, y entonces haces el codigo que te interese.

Saludos
 

Pablo Torres

Active Member
Licensed User
Longtime User
Hola, estoy en un proyecto similar, quiero "interceptar" los sms entrantes y luego "realizar algo" con cada uno de ellos, a medida que entran.
Tengo resuelto el "algo", no logro resolver como interceptar los sms
Un poquito de ayuda me vendría bien
 

Pablo Torres

Active Member
Licensed User
Longtime User
Hola, estoy en un proyecto similar, quiero "interceptar" los sms entrantes y luego "realizar algo" con cada uno de ellos, a medida que entran.
Tengo resuelto el "algo", no logro resolver como interceptar los sms
Un poquito de ayuda me vendría bien
 

Pablo Torres

Active Member
Licensed User
Longtime User
Hola bgsoft, sabes que en realidad el tutorial que mencionas... no es tan simple. Yo intente e intente con ese y otros tutoriales pero no pude hacerlo andar. Si vos lograste hacerlo, te animas a subir el codigo a modo de ejemplo, algo simple, un servicio que cuando llegue un mensaje lo muestre o algo de eso, muchas gracias.
Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pablo

Hola bgsoft, sabes que en realidad el tutorial que mencionas... no es tan simple.
La verdad que si no dices donde has encontrado el problema para interceptar es dificil darte una solución, por otro lado cada uno puede interpretar lo de simple dependiendo de si le funciona a la primera o no :D.

Bromas aparte, te pongo un codigo que he probado y funciona y que quizas sea mas simple que el del tutorial . Espero que te funcione tanto a ti como a softmicro, y si es asi, que softmicro cambie la cabecera del post añadiendo [Solucionado] para que el resto del foro se pueda beneficiar del código y encontrarlo rápido.

B4X:
Sub Process_Globals
   Dim SMSI As SmsInterceptor ' libreria Phone
End Sub

Sub Activity_Create(FirstTime As Boolean)
   If FirstTime Then SMSI.Initialize2("SMSI", 999)
End Sub

Sub SMSI_MessageReceived (From As String, Body As String) As Boolean
   ' evento interceptar mensaje
  Dim TextoCompleto As String
  TextoCompleto = "SMS recibido de: " From & CRLF & CRLF & "Texto del mensaje:" & Body
  Log(TextoCompleto)

  Return True
End Sub

Si quieres hacerlo y que funcione fuera de la aplicación, crea un servicio y pon en el Service_Create la declaración:

B4X:
  Dim SMSI As SmsInterceptor
  SMSI.Initialize2("SMSI", 999)

Y el evento el mismo que el anterior.

Saludos:
 

Pablo Torres

Active Member
Licensed User
Longtime User
Ok, voy a probarlo, discula que te moleste con 4 preguntas mas;
1) Cuando creo el servicio, que nombre debo ponerle?
2) Cuando dices "el evento el mismo que el anterior" entonces en el servicio, en la parte del evento debo poner:
Dim SMSI As SmsInterceptor
SMSI.Iniatalize2("SMSI",999)
Verdad?
3) Debo agregar una referencia a la libreria Phone, no?
4) Como lo transformo en un sticky service?

Muchas gracias por tu tiempo y tu paciencia y disculpa las molestias causadas
Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pablo

Creo que para contestar a tus dudas lo mejor es que leas mi tutorial sobre Módulos de Servicios:
http://www.b4x.com/android/forum/threads/b4a-tutorial-módulos-de-servicio.42689/

3) Debo agregar una referencia a la libreria Phone, no?
Siempre que en B4A tengas que emplear una libreria tendras que declararla, ya sea en un activity, servicio, modulo de clases, etc

No te preocupes por lo de las molestias, en este foro estamos para ayudarnos todos.

Si te surgen dudas diferentes a este post, lo mejor es que abras uno nuevo, de esa forma cualquiera podra ver esa pregunta y la posible respuesta, si la haces aqui nadie sabrá que está.

Saludos
 
Last edited:

Pablo Torres

Active Member
Licensed User
Longtime User
No puedo hacerlo andar
Compila, lo instalo... pero no hace absolutamente nada

código del main
B4X:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    Dim SMSIi As SmsInterceptor
End Sub

Sub Globals
End Sub

Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then StartService(SMSI)
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub SMSIi_MessageReceived (From As String, Body As String) As Boolean
Dim TextoCompleto As String
TextoCompleto="DE: " & From & CRLF & Body
ToastMessageShow(TextoCompleto,True)
Return True
End Sub

código del service (su nombre es SMSI)

B4X:
#Region  Service Attributes
    #StartAtBoot: True
    #StartCommandReturnValue: android.app.Service.START_STICKY
#End Region

Sub Process_Globals
    Dim SMSI As SmsInterceptor
End Sub
Sub Service_Create
    SMSI.Initialize2("SMSI",999)
End Sub

Sub Service_Start (StartingIntent As Intent)
    SMSI.Initialize2("SMSI",999)
End Sub

Sub Service_Destroy

End Sub
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pablo

Como decia Jack el Destripador: Vayamos por partes :D

B4X:
Sub Process_Globals
  Dim SMSIi AsSmsInterceptor
End Sub

Sub SMSIi_MessageReceived (From AsString, Body AsString) AsBoolean
  Dim TextoCompleto AsString
  TextoCompleto="DE: " & From & CRLF & Body
  ToastMessageShow(TextoCompleto,True)
  ReturnTrue
End Sub

Quita todo esto del activity, no tiene sentido ya que lo declaras en el servicio y por otro lado te dije que el evento lo crearas en el servicio y lo has puesto en el activity, al declarar el evento en el servicio y no poner el evento en el servicio, por supuesto que no hace nada.

Te dije que en el create del servicio pusieras:

Si quieres hacerlo y que funcione fuera de la aplicación, crea un servicio y pon en el Service_Create la declaración:
B4X:
Dim SMSI AsSmsInterceptor
SMSI.Initialize2("SMSI", 999)

Si lo haces en el Sub Service_Start, cada vez que entre creará una instancia del evento (hay que copiar bien :D)

Resumiendo:
- Quita lo que te he dicho del activity.
- Arregla las declaraciones en el servicio y hazlo donde te dije.
- Añade el evento en el servicio pero dale el mismo nombre que cuando lo inicialices ( SMSI.Initialize2("SMSI",999) ) , si lo llamas SMSI y el evento lo llamas SMSIi, jamás entrara en el.

Si quieres un consejo, copia mi codigo en un activity que son 6 lineas incluido el log, ejecuta el programa y no salgas de el, y con otro dispositivo envia a donde corra el programa un SMS, y veras como funciona. Una vez que veas que realmente funciona, pasalo a un servicio tal como te he explicado y vuelve a enviar otro SMS, si no te va, es que algo has echo mal.

Nota: Si te puse un LOG cuando capturaba el SMS no es por capricho, un LOG queda constancia escrita, un
ToastMessageShow no, ya que ademas te obliga a estar mirando la pantalla, y si por cualquier motivo dejas de mirarla tendras que volver a repetir la operación y gastar dinero en un nuevo mensaje para probar. Por otro lado, y esto es algo personal, si tengo que darle un nombre a un servicio lo llamo Servicio_NombredelServicio, de esta forma se en cualquier momento cuando al cabo del tiempo vuelva a mirar el codigo que es eso, e intento de no llamar a los servicios o modulos de clase con el mismo nombre que un evento o variable, tiende a confundir.

Cuando llamas al servicio puedes añadir esto, asi si está en marcha no lo vuelves a llamar:

B4X:
If FirstTime and IsPaused("SMSI") Then SMSI.Initialize2("SMSI", 999)

Saludos
 
Last edited:

Pablo Torres

Active Member
Licensed User
Longtime User
Hola de nuevo bgsoft, impecable tu respuesta, me ha quedado muy clara. Esta misma noche pruebo todo lo que me dijiste y luego te cuento.
Muchisimas gracias por tu ayuda
Saludos
 
Top