IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

[ Envoie SMS ] Savoir si un SMS à bien été envoyé


Sujet :

Android

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2008
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 280
    Par défaut [ Envoie SMS ] Savoir si un SMS à bien été envoyé
    Bonjour,

    une fois un sms envoyé, est-il possible de savoir s' il a bien été envoyé ? afin de pouvoir, par exemple, en envoyer un autre ?!


    Merci !

  2. #2
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Oui c'est possible ,

    http://developer.android.com/referen...ndingIntent%29

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<PendingIntent> deliveryIntent
    Ce PendingIntent te retournera un status que tu auras passer en paramètre lors de la réception du SMS .

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2008
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 280
    Par défaut
    Ok merci !

    Mais si c'est un service qui envoie un sms, ou dois-je avoir la méthode onActivityResult ??? Dans mon TimerTask ?!

    et pourquoi utiliser un tableau d'Intent ?!

  4. #4
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    [quotesi c'est un service qui envoie un sms, ou dois-je avoir la méthode onActivityResult ??? Dans mon TimerTask ?![/QUOTE]

    C'est un BroadcastReceiver.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BroadcastReceiver tonbroadcast = new BroadcastReceiver() {
    		@Override
    		public void onReceive(Context arg0, Intent arg1) {
                       switch (getResultCode()) {
    			case Activity.RESULT_OK:

    et pourquoi utiliser un tableau d'Intent ?!
    public void sendMultipartTextMessage (String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents)
    Since: API Level 4

    Send a multi-part text based SMS. The callee should have already divided the message into correctly sized parts by calling divideMessage.
    Parameters
    destinationAddress the address to send the message to
    scAddress is the service center address or null to use the current default SMSC
    parts an ArrayList of strings that, in order, comprise the original message
    sentIntents if not null, an ArrayList of PendingIntents (one for each message part) that is broadcast when the corresponding message part has been sent. The result code will be Activity.RESULT_OK for success, or one of these errors:
    RESULT_ERROR_GENERIC_FAILURE
    RESULT_ERROR_RADIO_OFF
    RESULT_ERROR_NULL_PDU
    For RESULT_ERROR_GENERIC_FAILURE each sentIntent may include the extra "errorCode" containing a radio technology specific value, generally only useful for troubleshooting.
    The per-application based SMS control checks sentIntent. If sentIntent is NULL the caller will be checked against all unknown applications, which cause smaller number of SMS to be sent in checking period.
    deliveryIntents if not null, an ArrayList of PendingIntents (one for each message part) that is broadcast when the corresponding message part has been delivered to the recipient. The raw pdu of the status report is in the extended data ("pdu").
    Throws
    IllegalArgumentException if destinationAddress or data are empty
    public void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
    Since: API Level 4

    Send a text based SMS.
    Parameters
    destinationAddress the address to send the message to
    scAddress is the service center address or null to use the current default SMSC
    text the body of the message to send
    sentIntent if not NULL this PendingIntent is broadcast when the message is successfully sent, or failed. The result code will be Activity.RESULT_OK for success, or one of these errors:
    RESULT_ERROR_GENERIC_FAILURE
    RESULT_ERROR_RADIO_OFF
    RESULT_ERROR_NULL_PDU
    For RESULT_ERROR_GENERIC_FAILURE the sentIntent may include the extra "errorCode" containing a radio technology specific value, generally only useful for troubleshooting.
    The per-application based SMS control checks sentIntent. If sentIntent is NULL the caller will be checked against all unknown applications, which cause smaller number of SMS to be sent in checking period.
    deliveryIntent if not NULL this PendingIntent is broadcast when the message is delivered to the recipient. The raw pdu of the status report is in the extended data ("pdu").
    Throws
    IllegalArgumentException if destinationAddress or text are empty
    l'Array n'est que si tu envoie les messages avec sendMultipartTextMessage , tu peux avoir un broadcast recever par message

    Sinon utilise sendmessage qui lui n'a qu'un seul PendingIntent

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2008
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 280
    Par défaut
    Bonjour,

    Dans quel cas utiliser un multi???

    Pense tu que c'est possible d'en envoyer plusieurs à la suite ou tu crois qu'il y a une restriction à ce niveau ?? du genre pas plus d'un message toutes les 5 mn ?!

  6. #6
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    After you define your own SmsManager, you can divide your SMS message by 160 bytes. (Optional, if your SMS always less than 160 bytes, you can pass this part)
    Donc le multi est utile si ton message contient plus de 160 bytes .

    http://mobdev.olin.edu/mobdevwiki/Fr...MS%20Messaging
    tu crois qu'il y a une restriction à ce niveau ?? du genre pas plus d'un message toutes les 5 mn ?!
    Personnellement je ne pense pas ...

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2008
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 280
    Par défaut
    ok cool merci !!

  8. #8
    Membre éclairé
    Inscrit en
    Décembre 2008
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 280
    Par défaut
    Hum il y a un truc que je comprend pas, dans ton tuto il dise qu'il faut mettre le traitement d'après l'envoie dans le onReceived, mais moi c'est la que je lance mon service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    @Override
        public void onReceive(Context context, Intent intent) {
            Log.i("", "Boot Event");
            try{
            	 Intent serviceIntent = new Intent();
                 serviceIntent.setClassName("com.xxx", "com.xxx.BackgroundService"); 
                 context.startService(serviceIntent); 
    		}
    		catch (Exception e)
    		{
    			e.printStackTrace();
    		}
        }
    Le truc c'est que je voudrais savoir par exemple si mon message à bien été envoyé, et s'il n'a pas bien été envoyé, il faudrait que je puisse soit recommencé, soit renseigné un champs de ma BDD pour que je le renvoie plus tard ... mais la je sèche !

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2008
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 280
    Par défaut
    et son pendingIntent va vers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public static final String SMS_SENT_ACTION="com.tilab.msn.SMS_SENT";
    L'activity SMS_SENT, donc c'est cette activity qui gère le résultat nan ?

  10. #10
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Euh , tu vas trop vite ,

    Hum il y a un truc que je comprend pas, dans ton tuto il dise qu'il faut mettre le traitement d'après l'envoie dans le onReceived, mais moi c'est la que je lance mon service :
    Je n' avais pas compris au premier abord , mais ce qu'il t'explique c'est le onReceive du programme de réception du SMS .

    ton BroadCast doit être directement dans ta classe et il n'a pas besoin d'action déclaré dans le manifest , puisque c'est le pendingIntent qui l'appellera .

    Edit :
    et son pendingIntent va vers :
    Code :
    public static final String SMS_SENT_ACTION="com.tilab.msn.SMS_SENT";
    L'activity SMS_SENT, donc c'est cette activity qui gère le résultat nan ?
    C'est l'action que tu associes à ton PendingIntent , donc dans le BroadCast il te suffit de récupérer l'action associé pour savoir quel PendingIntent t'as appelé

  11. #11
    Membre éclairé
    Inscrit en
    Décembre 2008
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 280
    Par défaut
    ton BroadCast doit être directement dans ta classe et il n'a pas besoin d'action déclaré dans le manifest , puisque c'est le pendingIntent qui l'appellera .
    Donc en gros c'est une activity qui n'en est pas vraiment une ?


    C'est l'action que tu associes à ton PendingIntent , donc dans le BroadCast il te suffit de récupérer l'action associé pour savoir quel PendingIntent t'as appelé
    oui mais dans le onReceive j'ai mon boot event, je fais comment pour différencier les 2 cas ?!

  12. #12
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Donc en gros c'est une activity qui n'en est pas vraiment une ?
    Non c'est un Intent , avec une action associée , ne confonds pas Intent et Activity .


    oui mais dans le onReceive j'ai mon boot event, je fais comment pour différencier les 2 cas ?!
    C'est pas le même Broadcast exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent("action envoie"), 0);
    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
    			new Intent("action delivre"), 0);
     
    registerReceiver(tonbroadcastdenvoie, new IntentFilter("action envoie"));
     
    		// ---when the SMS has been delivered---
    		registerReceiver(tonbroadcastlorsquelemessageestdelivre, new IntentFilter(
    				"action delivre"));
     
    		SmsManager smsManager = SmsManager.getDefault();
    		smsManager.sendTextMessage("adresse", null, message, sentPI,deliveredPI);
     
     
    BroadcastReceiver tonbroadcastdenvoie = new BroadcastReceiver() {
    		@Override
    		public void onReceive(Context arg0, Intent arg1) {
                                // tu regardes si le result de l'intent est OK
                                // tu regardes a quel message il appartien en regardant le nom de l'action dans l'intent 
    }
    }
     
     
    BroadcastReceiver tonbroadcastlorsquelemessageestdelivre = new BroadcastReceiver() {
    		@Override
    		public void onReceive(Context arg0, Intent arg1) {
                                // tu regardes si le result de l'intent est OK
                                // tu regardes a quel message il appartien en regardant le nom de l'action dans l'intent 
     
    }
    }

  13. #13
    Membre éclairé
    Inscrit en
    Décembre 2008
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 280
    Par défaut
    ok je vais étudier ça cet aprem je te tiens au jus !

  14. #14
    Membre éclairé
    Inscrit en
    Décembre 2008
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 280
    Par défaut
    Ok donc pour ce qui est du broadcast receiver je pense que c'est bon mais il va falloir que je fasse des test réel, par contre si j'ai bien compris l'action que je vais recevoir ça va être soit : "action delivre" ou "action envoie" ???

    Donc comment je peux chopper le statut du SMS, pour savoir s'il est en cours d'envoie ou bloqué car pas de réseau??? J'ai vu que les statut serve à ça mais je vois pas comment les choppers : STATUS_ON_ICC_FREE, etc

    merci de ton aide !

  15. #15
    Membre éclairé
    Inscrit en
    Décembre 2008
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 280
    Par défaut
    Je viens de faire un test réel, donc je ne sais pas si mes SMS ont vraiment été envoyé ou s'il sont en erreur ou en attente. Bref j'ai mi un log dans mon receiver mais celui-ci ne se lance pas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     @Override
        public void onReceive(Context context, Intent intent) {
            Log.i("", "SMS RECEIVER");
            Log.i("", "SMS RECEIVER ACTION :" + intent.getAction());
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for(int i = 0; i < mMsgList.size() ; i++)
    		{
    			mIntentPI.putExtra("SubSmsNum", (mMsgList.size() > 1)? "Part " +  i + " of SMS " : "SMS ");
    			PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, mIntentPI, 0);
    			mIntentPIList.add(sentPI);
    		}
    mIntentPI est initialisé plus haut, peut être faut-il que j'en recrée une absolument à chaque itération ?

  16. #16
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    J'arrive pas à expliquer donc pour faire plus simple

    http://blog.srijna.com/2010/10/26/se...d-application/

Discussions similaires

  1. Réponses: 9
    Dernier message: 05/03/2010, 18h38
  2. Envoie d'email et de SMS
    Par Rock01 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 17/02/2009, 23h03
  3. [SMS] Envoi et reception d'un SMS
    Par ghoga dans le forum Multimédia
    Réponses: 3
    Dernier message: 14/08/2008, 18h23
  4. Envoi HTTP pour plate forme SMS : comment ?
    Par Invité dans le forum Langage
    Réponses: 6
    Dernier message: 20/07/2006, 10h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo