PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV Mobile 22 → [Android] Lecture de SMS - Action sur arrivée nouveau sms - Lecture de sms provenant d'un numéro spécifié.
[Android] Lecture de SMS - Action sur arrivée nouveau sms - Lecture de sms provenant d'un numéro spécifié.
Started by Cezame, Jul., 01 2014 6:06 PM - 28 replies
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 01 2014 - 6:06 PM
Bonjour,

Pour les besoins d'une application j'aurais besoin de lancer une commande lorsqu'un nouvel SMS arrive sur l'appareil.

Est ce possible avec WM19?

D'autre part je souhaiterai lire les sms envoyés par un numéro spécifié. Mais seulement provenant de ce numéro.

Aujourd'hui grace aux commandes du wla,guage je suis obligé de lire l'ensemble des messages à chaque fois ce qui peut être assez long suivant le nombre de messages sur l'appareil.

D'avance merci pour votre aide.

Cordialement

Cezame
http://hostimage.webdev.info/avatars/1kWSDjlf7a17u0Oyji4A
Registered member
92 messages
Popularité : +1 (1 vote)
Posted on July, 02 2014 - 9:12 AM
bonjour,

c'est possible en effet.
avec les intents java sms_received.

import android.content.*;
import android.telephony.*;

public static void RecoitSMS() {
final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
//SMS_RECEIVED_ACTION
getActiviteEnCours().registerReceiver(mSmsInfoReceiver, new IntentFilter(SMS_RECEIVED));
}

static BroadcastReceiver mSmsInfoReceiver = new BroadcastReceiver(){

public void onReceive(Context arg0, Intent intent) {

Bundle extras = intent.getExtras();
String messages = "";
Object[] smsExtra = (Object[]) extras.get( "pdus" );

for ( int i = 0; i < smsExtra.length; i++ )
{
// SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
// String body = sms.getMessageBody().toString();
// String address = sms.getOriginatingAddress();

appelProcedureWL("AffecteSms");
}

}

public void onDestroy() {
getActiviteEnCours().unregisterReceiver(mSmsInfoReceiver);
}

};
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 02 2014 - 10:37 AM
floman321 a écrit :
bonjour,

c'est possible en effet.
avec les intents java sms_received.

import android.content.*;
import android.telephony.*;

public static void RecoitSMS() {
final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
//SMS_RECEIVED_ACTION
getActiviteEnCours().registerReceiver(mSmsInfoReceiver, new IntentFilter(SMS_RECEIVED));
}

static BroadcastReceiver mSmsInfoReceiver = new BroadcastReceiver(){

public void onReceive(Context arg0, Intent intent) {

Bundle extras = intent.getExtras();
String messages = "";
Object[] smsExtra = (Object[]) extras.get( "pdus" );

for ( int i = 0; i < smsExtra.length; i++ )
{
// SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
// String body = sms.getMessageBody().toString();
// String address = sms.getOriginatingAddress();

appelProcedureWL("AffecteSms");
}

}

public void onDestroy() {
getActiviteEnCours().unregisterReceiver(mSmsInfoReceiver);
}

};


Bonjour et merci pour ta réponse rapide.

Comment intégrer ton code simplement sous WM19?

D'avance merci

Cezame
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 02 2014 - 11:07 AM
Pour préciser ma réponse je demandais ou intégrer la procédure java dans le code?

L'intégrer dans le code d'initialisation de ma fenêtre permettra de lancer la procédure "AffecteSMS" à chaque arrivée de sms sur mon appareil?

Encore merci pour ton aide

Cezame
http://hostimage.webdev.info/avatars/1kWSDjlf7a17u0Oyji4A
Registered member
92 messages
Popularité : +1 (1 vote)
Posted on July, 02 2014 - 12:08 PM
facile 8) ! tu créer une procédure globale puis en met ton code en java (en haut a gauche tu as une option dans le code) et tu colle le code.
http://hostimage.webdev.info/avatars/1kWSDjlf7a17u0Oyji4A
Registered member
92 messages
Popularité : +1 (1 vote)
Posted on July, 02 2014 - 12:15 PM
n'oubliet pas de rajouter la permission RECEIVE_SMS lors de création de l'APK (exécutable)
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 02 2014 - 12:24 PM
J'avais compris cette étape la...

Ensuite je n'ai qu'à lancer la procédure par exemple das e code d'initialisation et la procédure "AffecteSMS" sera lancée automatiquement à chaque réception de nouvel sms?

J'ai une erreur de compilation sur le code que tu m'as transmis...

"; expected"

Je ne voies pas ou ce ; manque?

Encore meri

Cezame
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 02 2014 - 12:42 PM
Voici le code que j'ai utilisé dans une procédure Globale

import android.content.*;
import android.telephony.*;

PUBLIC static void RecoitSMS() {
final string SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
//SMS_RECEIVED_ACTION
getActiviteEnCours().registerReceiver(mSmsInfoReceiver, new IntentFilter(SMS_RECEIVED));
}

static BroadcastReceiver mSmsInfoReceiver = new BroadcastReceiver(){

PUBLIC void onReceive(Context arg0, Intent intent) {

Bundle extras = intent.getExtras();
string messages = "";
object[] smsExtra = (object[]) extras.get( "pdus" );

for ( int i = 0; i < smsExtra.length; i++ )
{
SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
string body = sms.getMessageBody().toString();
string Address = sms.getOriginatingAddress();
appelProcedureWL_String("TraiteSmsEntrant" , Address , body);
}

}

PUBLIC void onDestroy() {
getActiviteEnCours().unregisterReceiver(mSmsInfoReceiver);
}

};


La procédure appellée est TraiteSMSEntrant à laquelle je passe en paramètre le numéro d'appel et le message reçu.

J'ai une erreur de compilation " ; expected" mais je ne trouves pas ou...

Autre question est il possible de supprimer le sms suivant un traitement dans la procédure TraiteSMSEntrant.

La procédure renvoyant vrai ou faux si le message doit être supprimé ou pas.

Encore merci

Cezame
http://hostimage.webdev.info/avatars/1kWSDjlf7a17u0Oyji4A
Registered member
92 messages
Popularité : +1 (1 vote)
Posted on July, 02 2014 - 1:56 PM
oui code d'init de la fenetre ou projet
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 02 2014 - 2:20 PM
Je n'arrive toujours pas à trouver l'erreur "; expected" dans mon code...

PUBLIC static void _ReceptionSMS()
// Résumé : Lance la procédure TraiteSMSEntrant à chaque sms entrant
// Syntaxe :
// _ReceptionSMS ()
//
// Paramètres :
//Aucun
// Valeur de retour :
// Aucune
//
// Exemple :
// Indiquez ici un exemple d'utilisation.
import android.content.*;
import android.telephony.*;

PUBLIC static void RecoitSMS() {
final string SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
//SMS_RECEIVED_ACTION
getActiviteEnCours().registerReceiver(mSmsInfoReceiver, new IntentFilter(SMS_RECEIVED));
}

static BroadcastReceiver mSmsInfoReceiver = new BroadcastReceiver(){

PUBLIC void onReceive(Context arg0, Intent intent) {

Bundle extras = intent.getExtras();
string messages = "";
object[] smsExtra = (object[]) extras.get( "pdus" );

for ( int i = 0; i < smsExtra.length; i++ )
{
SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
string body = sms.getMessageBody().toString();
string Address = sms.getOriginatingAddress();
appelProcedureWL_String("TraiteSmsEntrant" , Address , body);
}

}

PUBLIC void onDestroy() {
getActiviteEnCours().unregisterReceiver(mSmsInfoReceiver);
}

};


Est ce que l'appelProcedureWL_String est correct ? Je souhaite passer en paramètre le numéro appelant et le message.

Est il possible que la procédure "TraiteSMSentrant" renvoie vrai ou faux et permette la suppression du message si vrai?

Encore merci pour ton aide.

Cezame
http://hostimage.webdev.info/avatars/1kWSDjlf7a17u0Oyji4A
Registered member
92 messages
Popularité : +1 (1 vote)
Posted on July, 02 2014 - 3:49 PM
http://doc.pcsoft.fr/fr-FR/?9000108&name=particularites_des_applications_pour_android

import android.content.*;
import android.telephony.*;

PUBLIC static void RecoitSMS() {
final string SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
//SMS_RECEIVED_ACTION
getActiviteEnCours().registerReceiver(mSmsInfoReceiver, new IntentFilter(SMS_RECEIVED));
}

static BroadcastReceiver mSmsInfoReceiver = new BroadcastReceiver(){

PUBLIC void onReceive(Context arg0, Intent intent) {

Bundle extras = intent.getExtras();
string messages = "";
object[] smsExtra = (object[]) extras.get( "pdus" );

for ( int i = 0; i < smsExtra.length; i++ )
{
//SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
//String body = sms.getMessageBody().toString();
//String address = sms.getOriginatingAddress();

appelProcedureWL("AffecteSms");


}

}

PUBLIC void onDestroy() {
getActiviteEnCours().unregisterReceiver(mSmsInfoReceiver);
}

};
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 02 2014 - 4:34 PM
Je n'arrive pas à trouver l'erreur de ; dans le code que tu m'as envoyé...

Du coup je n'arrive pas à tester la solution, tu voies l'erreur?

D'avance merci

Cezame
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 02 2014 - 5:49 PM
En utilisant le dernier code que tu m'as envoyé j'ai les erreurs suivantes

Erreur retournée :
src\com\cezame\gps\wdgen\GWDCPCOL_ProceduresGlobales.java:1041: error: <identifier> expected
PUBLIC static void RecoitSMS() {
^
src\com\cezame\gps\wdgen\GWDCPCOL_ProceduresGlobales.java:1049: error: <identifier> expected
PUBLIC void onReceive(Context arg0, Intent intent) {
^
src\com\cezame\gps\wdgen\GWDCPCOL_ProceduresGlobales.java:1049: error: invalid method declaration; return type required
PUBLIC void onReceive(Context arg0, Intent intent) {
^
src\com\cezame\gps\wdgen\GWDCPCOL_ProceduresGlobales.java:1068: error: <identifier> expected
PUBLIC void onDestroy() {
^
src\com\cezame\gps\wdgen\GWDCPCOL_ProceduresGlobales.java:1068: error: invalid method declaration; return type required
PUBLIC void onDestroy() {
^
5 errors

Je n'y comprends plus rien...
http://hostimage.webdev.info/avatars/1kWSDjlf7a17u0Oyji4A
Registered member
92 messages
Popularité : +1 (1 vote)
http://hostimage.webdev.info/avatars/1GlUcyWjIOZgun9L8Fxzw
Registered member
36 messages
Posted on July, 03 2014 - 11:19 AM
Je crois qu'il faut écrire les "PUBLIC" en minuscule comme ceci : public
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 03 2014 - 3:20 PM
Les public sont en minuscule... C'est lorsqu'on affiche le code comme du Wlangage qu'ils apparaisssent en majuscules sur le message.

Merci pour ton aide tout de même.
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 03 2014 - 3:48 PM
floman321 a écrit :
> https://dl.dropboxusercontent.com/u/2279433/essai.java

Je télécharge Eclipse pour visualiser le code...

Encore merci

Cezame
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 03 2014 - 4:15 PM
floman321 a écrit :
> https://dl.dropboxusercontent.com/u/2279433/essai.java

En copiant ce code dans l'éditeur dans une procédure globale Java voici le message d'erreur que j'obtiens...

Ligne de commande : "C:\Program Files\Java\jdk1.7.0_51\bin\javac.exe" -encoding UTF-16LE -nowarn -source 1.5 -target 1.5 -d bin\classes -bootclasspath "C:\Android\sdk\platforms\android-18\android.jar" gen\com\cezame\gps\*.java src\com\cezame\gps\wdgen\*.java gen\com\google\android\gms\*.java -classpath "libs;bin\classes;libs\android-support-v4.jar;libs\google-play-services.jar"


Erreur retournée :
src\com\cezame\gps\wdgen\GWDCPCOL_ProceduresGlobales.java:879: error: cannot find symbol
Bundle extras = intent.getExtras();
^
symbol: class Bundle
1 error

Ce code est bien compilé sous WM de ton côté?

Je n'y comprends plus rien. Encore merci.

Quelqu'un aurait une idée du pourquoi cette erreur générée?

D'avance merci

Cezame
http://hostimage.webdev.info/avatars/1kWSDjlf7a17u0Oyji4A
Registered member
92 messages
Popularité : +1 (1 vote)
Posted on July, 04 2014 - 8:04 AM
il faut rajouter un
import android.os.Bundle;
premierer ligne
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 04 2014 - 4:49 PM
Bonjour et encore merci pour ton aide.

J'ai ajouter la ligne au départ à ton code et maintenant plus d'erreur de compilation.

J'ai ajouté dans le code d'initialisation de ma fenetre principale
RecoitSMS()


Lorsqu'un SMS arrive sur le téléphone il ne se passe rien la procédure n'est pas lancée par la commande

appelProcedureWL("TraiteSMSEntrant");


J'ai juste mis un le code
Info("sms entrant")

dans la procédure...

Merci d'avance pour votre aide
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 06 2014 - 1:06 PM
Bonjour Cezame,

J'ai testé ce code de floman321 et ça marche très bien.
Voici les étapes :

1. Créer projet un reception_sms.
2. Dans le code de la fenêtre principale, Déclarations globales, ajouter le code
RecoitSMS()


3. Créer 1 procedure globale ( RecoitSMS() en java ) :
Attention ne pas mettre de nom de procédure avant les import.* comme c'est le cas en wlangage

import android.os.Bundle;
import android.content.*;
import android.telephony.*;

PUBLIC static void RecoitSMS() {
final string SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
//SMS_RECEIVED_ACTION
getActiviteEnCours().registerReceiver(mSmsInfoReceiver, new IntentFilter(SMS_RECEIVED));
}

static BroadcastReceiver mSmsInfoReceiver = new BroadcastReceiver(){

PUBLIC void onReceive(Context arg0, Intent intent) {

Bundle extras = intent.getExtras();
string messages = "";
object[] smsExtra = (object[]) extras.get( "pdus" );

for ( int i = 0; i < smsExtra.length; i++ )
{
//SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
//String body = sms.getMessageBody().toString();
//String address = sms.getOriginatingAddress();

appelProcedureWL("AffecteSms");


}

}

PUBLIC void onDestroy() {
getActiviteEnCours().unregisterReceiver(mSmsInfoReceiver);
}

};


4. Créer une procédure globale ( AffecteSms() en WLangage )

Procedure AffecteSms()
Info("sms entrant")


5. Au moment de la génération de l'application Android, Ajouter la permission suivante
android.permission.RECEIVE_SMS Permet à une application de contrôler les messages sMS entrants, d'enregistrer ou d'effectuer des traitements.


Je pense que l'erreur dans ton code est d'avoir ajouté la ligne

PUBLIC static void _ReceptionSMS()

dans ta procedure RecoitSMS


Cdt

Mohamed
http://hostimage.webdev.info/avatars/1kWSDjlf7a17u0Oyji4A
Registered member
92 messages
Popularité : +1 (1 vote)
Posted on July, 07 2014 - 8:30 AM
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 07 2014 - 10:24 AM
Bonjour,
Merci floman321 pour ce code qui fonctionne très bien pour les SMS.
Aurais-tu un exemple de code java pour les "incoming calls" et son intégration dans un projet windev mobile?
Merci d'avance

Mohamed
http://hostimage.webdev.info/avatars/1kWSDjlf7a17u0Oyji4A
Registered member
92 messages
Popularité : +1 (1 vote)
Posted on July, 07 2014 - 11:16 AM
même code mais avec TelephonyManager.ACTION_PHONE_STATE_CHANGED


static BroadcastReceiver mSurveilleAppelEntrant = new BroadcastReceiver(){
public void onReceive(Context arg0, Intent intent) {
final String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
final String incomingState = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 07 2014 - 1:51 PM
Merci beaucoup :)
Je vais tester le code ce soir.

Cdt

Mohamed
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 07 2014 - 5:38 PM
Bonjour,

Je viens de tester le code après recompilation de mon projet et ça fonctionne maintenant.

Encore merci pour ton aide.

J'ai maintenant modifié le code pour traiter le sms entrant.

Je souhaiterai pouvoir supprimer le sms suivant le traitement fait dans AffecteSMS.

J'ai donc modifié la procédure Java comme suit...


for ( int i = 0; i < smsExtra.length; i++ )
{
SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
string body = sms.getMessageBody().toString();
string Address = sms.getOriginatingAddress();

appelProcedureWL_boolean("AffecteSms",Address,body);


}


AffecteSMS renvoie vrai si le sms doit être supprimé et faux sinon.

Quel code java permet de supprimer le sms et comment récupérer la valeur vrai ou faux renvoyée par AffecteSms?

D'avance merci

Cezame
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 08 2014 - 12:53 PM
Bonjour et encore merci à tous pour votre aide.

J'avance dans la gestion d'email entrant je souhaiterai pouvoir sous certaines conditions supprimer un email entrant (provenant d'un numéro par exemple).

Je cherche la fonction java qui complèterai mon code et me renverrai l'ID du sms.

Quelqu'un aurait cette fonction?

D'avance merci

Cezame
http://hostimage.webdev.info/avatars/default.gif
Posted on July, 10 2014 - 12:04 PM
Bonjour à tous,

J'ai bien avancé sur mon problème d'interception de sms entrant.

Je cherche maintenant à pouvoir supprimer le sms après traitement.

N'étant pas un spécialiste Java (loin de la) je m'adresse aux spécialistes...

Voici mon code :

import android.content.*;
import android.telephony.*;
import android.os.Bundle;

PUBLIC static void RecoitSMS() {
final string SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
//SMS_RECEIVED_ACTION
getActiviteEnCours().registerReceiver(mSmsInfoReceiver, new IntentFilter(SMS_RECEIVED));
}

static BroadcastReceiver mSmsInfoReceiver = new BroadcastReceiver(){

PUBLIC void onReceive(Context arg0, Intent intent) {

Bundle extras = intent.getExtras();
string messages = "";
object[] smsExtra = (object[]) extras.get( "pdus" );

for ( int i = 0; i < smsExtra.length; i++ )
{
SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
string body = sms.getMessageBody().toString();
string Address = sms.getOriginatingAddress();

boolean DeleteSMS = appelProcedureWL_boolean("AffecteSms",Address,body);
IF (DeleteSMS = True){
appelProcedureWL("SupprimeSms");

}

}

}

PUBLIC void onDestroy() {
getActiviteEnCours().unregisterReceiver(mSmsInfoReceiver);
}

};


Afin de supprimer le message j'aurais besoin de la commande Java me renvoyant l'ID du sms entrant. Ceci en modifiant le code comme suit :
SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
string body = sms.getMessageBody().toString();
string Address = sms.getOriginatingAddress();
int Idsms = sms. * Commande manquante
boolean DeleteSMS = appelProcedureWL_boolean("AffecteSms",Address,body);
IF (DeleteSMS = True){
appelProcedureWL("SupprimeSms",Idsms);

}


Ou alors la commande permettant la suppression du message en java comme suit...

SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
string body = sms.getMessageBody().toString();
string Address = sms.getOriginatingAddress();

boolean DeleteSMS = appelProcedureWL_boolean("AffecteSms",Address,body);
IF (DeleteSMS = True){
*Commande Java suppression sms*

}


Merci d'avance pour votre aide

Cezame
http://hostimage.webdev.info/avatars/default.gif
Posted on January, 12 2017 - 11:37 AM
I tried your code but i receive this kind of errors :

Erreur retournée :
src\com\masociete\agenda_sms\wdgen\GWDCPGenerale.java:70: error: cannot find symbol
final string SMS_RECEIVED="android.provider.Telephony.SMS_RECEIVED";
^
symbol: class string
location: class GWDCPGenerale
src\com\masociete\agenda_sms\wdgen\GWDCPGenerale.java:80: error: cannot find symbol
string messages="";
^
symbol: class string
src\com\masociete\agenda_sms\wdgen\GWDCPGenerale.java:81: error: cannot find symbol
object[]smsExtra= (object[])extras.get("pdus");
^
symbol: class object
src\com\masociete\agenda_sms\wdgen\GWDCPGenerale.java:81: error: cannot find symbol
object[]smsExtra= (object[])extras.get("pdus");
^
symbol: class object
src\com\masociete\agenda_sms\wdgen\GWDCPGenerale.java:86: error: cannot find symbol
string body=sms.getMessageBody().toString();
^
symbol: class string
src\com\masociete\agenda_sms\wdgen\GWDCPGenerale.java:87: error: cannot find symbol
string Address=sms.getOriginatingAddress();
^
symbol: class string
Note: src\com\masociete\agenda_sms\wdgen\GWDCPGenerale.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
6 errors

the code that i tried is :


public static void RecoitSMS() {
final string SMS_RECEIVED="android.provider.Telephony.SMS_RECEIVED";
//SMS_RECEIVED_ACTION
getActiviteEnCours().registerReceiver(mSmsInfoReceiver,newIntentFilter(SMS_RECEIVED));
}

static BroadcastReceiver mSmsInfoReceiver=new BroadcastReceiver(){

public void onReceive(Context arg0,Intent intent) {

Bundle extras=intent.getExtras();
string messages="";
object[]smsExtra= (object[])extras.get("pdus");

for(int i=0;i<smsExtra.length;i++ )
{
SmsMessage sms=SmsMessage.createFromPdu((byte[])smsExtra[i]);
string body=sms.getMessageBody().toString();
string Address=sms.getOriginatingAddress();


}

}

public void onDestroy() {
getActiviteEnCours().unregisterReceiver(mSmsInfoReceiver);
}

};

I tested it in a global brocedure and changed it to jave procedure, do i have to create a class?