Gestionnaire de SMS (Gestionnaire de SMS)


Introduction à cette section :

Cette section présente SmsManager (Short Message Manager) dans Android Comme son nom l'indique, il est utilisé pour gérer les messages texte du téléphone mobile. Il n'existe pas beaucoup de scénarios d'application de ce type. Généralement, nous utilisons cette API uniquement lors de l'envoi de messages texte. Bien entendu, ce type de message texte l'est. Les messages texte sont trop compliqués pour les MMS, et à l'ère où QQ, WeChat et diverses applications sociales sévissent, vous en enverrez un pour 1 yuan. MMS ? Donc, dans cette section, nous discutons uniquement de l’envoi de messages texte ordinaires ! Document officiel : SmsManager


1. Appeler le système pour envoyer des messages texte :

consiste à envoyer le destinataire écrit et le contenu à L'interface du système d'envoi de messages texte demande à l'utilisateur de vérifier si le contenu du destinataire est bien correct avant de cliquer sur envoyer ! Pour parler franchement, il s'agit d'appeler la fenêtre d'envoi de messages texte du système. Cela présente certains avantages :

Envoyer des messages texte de cette manière Lorsque l'application est installée, vous pouvez écrire une autorisation de moins. pour envoyer des messages texte, puis comme 360 ​​Lors de l'installation de ce type de logiciel de sécurité Il ne sera pas rappelé à l'utilisateur : "Cette application dispose d'autorisations SMS et peut envoyer secrètement des messages texte." Et les utilisateurs sont très préoccupés par l'envoi secret de messages texte. C'est dégoûtant. Bien sûr, certaines personnes l'installent sans le regarder, et certaines personnes peuvent penser qu'elle peut envoyer secrètement des messages texte. C'est une application tellement dégoûtante que je ne ferai pas semblant. Ou interdire directement à notre application d'envoyer des messages texte, certaines anomalies peuvent alors se produire lorsque notre application envoie des messages texte, ou L'application plante directement et ainsi de suite ! Donc, si votre application doit envoyer des SMS pour vérification ou paiement, il est recommandé d'utiliser cette méthode

Code principal :

public void SendSMSTo(String phoneNumber,String message){    
    //判断输入的phoneNumber是否为合法电话号码  
    if(PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber)){  
        //Uri.parse("smsto") 这里是转换为指定Uri,固定写法  
        Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+phoneNumber));        
        intent.putExtra("sms_body", message);              
        startActivity(intent);    
    }    
}

 ! 2. Appelez l'interface SMS fournie par le système pour envoyer des messages texte

Cela nécessite l'autorisation d'envoyer des messages texte

uses-permission android:name="android. permission.SEND_SMS" />

Nous appelons directement l'interface SMS fournie par SmsManager pour envoyer des messages texte :

sendTextMessage(destinationAddress, scAddress, text, sentIntent, DeliverIntent);

Les paramètres dans l'ordre sont :

  • destinationAddress : Le numéro de téléphone du destinataire
  • scAddress : Le numéro du centre SMS, si nul, utiliser le service SMS par défaut actuel center
  • text : contenu du SMS
  • sentIntent : informations sur l'état d'envoi du SMS : (Intention de l'état d'envoi) S'il n'est pas nul, ce PendingIntent est diffusé lorsque le message est envoyé avec succès ou échoue. Le code de résultat est Activity.RESULT_OK Indique le succès, ou RESULT_ERROR_GENERIC_FAILURE, RESULT_ERROR_RADIO_OFF, RESULT_ERROR_NULL_PDU L'un indique une erreur. Correspondant à RESULT_ERROR_GENERIC_FAILURE, sentIntent peut inclure un « code d'erreur » supplémentaire contenant un Une valeur spécifique à la technologie radio qui n'est généralement utile que pour résoudre des dysfonctionnements. Chaque application basée sur SMS contrôle la détection de sentIntent. Si sentIntent est vide, l’appelant détectera toutes les applications inconnues, ce qui entraînera l’envoi d’un plus petit nombre de SMS lorsqu’il sera détecté.
  • deliverIntent : Informations d'état indiquant si le message texte a été reçu par l'autre partie : (Intention de recevoir l'état) S'il n'est pas nul, lorsque ce message est envoyé au destinataire, le PendingIntent sera diffusé. Le pdu généré par le rapport d'état (faisant référence à l'unité de données transférée entre les niveaux homologues) sera étendu aux données ("pdu")

1.jpg... Tellement compliqué, quoi est-ce que le pdu est un œuf ? Eh bien, ne vous inquiétez pas, connaissez simplement ces paramètres :

numéro de téléphone, centre d'information, contenu du message texte, contrôle de la réussite de l'envoi et si le destinataire accepte le contrôle !

Code principal

public void sendSMS(String phoneNumber,String message){  
    //获取短信管理器   
    android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault();  
    //拆分短信内容(手机短信长度限制),貌似长度限制为140个字符,就是
    //只能发送70个汉字,多了要拆分成多条短信发送
    //第四五个参数,如果没有需要监听发送状态与接收状态的话可以写null    
    List divideContents = smsManager.divideMessage(message);   
    for (String text : divideContents) {    
        smsManager.sendTextMessage(phoneNumber, null, text, sentPI, deliverPI);    
    }  
}

Peut-être devez-vous également surveiller si le message texte est envoyé avec succès ou si le destinataire reçoit le message, alors ajoutez simplement ce qui suit :

1) Traitez le sentIntent

//处理返回的发送状态   
String SENT_SMS_ACTION = "SENT_SMS_ACTION";  
Intent sentIntent = new Intent(SENT_SMS_ACTION);  
PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, sentIntent,  0);  
//注册发送信息的广播接收者
context.registerReceiver(new BroadcastReceiver() {  
    @Override  
    public void onReceive(Context _context, Intent _intent) {  
        switch (getResultCode()) {  
        case Activity.RESULT_OK:
            Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show();  
            break;  
        case SmsManager.RESULT_ERROR_GENERIC_FAILURE:    //普通错误
            break;
        case SmsManager.RESULT_ERROR_RADIO_OFF:         //无线广播被明确地关闭
            break;          
        case SmsManager.RESULT_ERROR_NULL_PDU:          //没有提供pdu
            break;      
        case SmsManager.RESULT_ERROR_NO_SERVICE:         //服务当前不可用
            break;              
        }  
    }  
}, new IntentFilter(SENT_SMS_ACTION));

qui renvoie le statut d'envoi ; 2) Traitez le deliverIntent qui renvoie le statut de réception :

//处理返回的接收状态   
String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";  
//创建接收返回的接收状态的Intent  
Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);  
PendingIntent deliverPI = PendingIntent.getBroadcast(context, 0,deliverIntent, 0);  
context.registerReceiver(new BroadcastReceiver() {  
   @Override  
   public void onReceive(Context _context, Intent _intent) {  
       Toast.makeText(context,"收信人已经成功接收", Toast.LENGTH_SHORT).show();  
   }  
}, new IntentFilter(DELIVERED_SMS_ACTION));

De plus, cela implique des connaissances en matière de diffusion. Si vous ne savez pas grand-chose en matière de diffusion, vous pouvez jeter un œil :

Tutoriel d'introduction de base Android - Essai génial de BroadcastReceiver

Tutoriel d'introduction à Android Basic - 4.3.2 BroadcastReceiver庖丁杰牛


Résumé de cette section :

2.gif D'accord, cette section présente SmsManager pour envoyer du texte. Il existe deux façons d'envoyer des messages texte ~ très simple ~ il est recommandé d'utiliser La première option, au moins l'expérience utilisateur est meilleure...