SmsManager(SMSマネージャー)


このセクションの紹介:

このセクションでは、Android の SmsManager (ショート メッセージ マネージャー) について紹介します。その名前が示すように、携帯電話のテキスト メッセージを管理するために使用されます。 通常、この種のテキスト メッセージを送信する場合にのみ、この API を使用します。 テキストメッセージはMMSには複雑すぎるし、QQやWeChat、各種ソーシャルアプリが跋扈する時代では1通1元で送信することになる。 MMS?したがって、このセクションでは、通常のテキスト メッセージの送信についてのみ説明します。 公式ドキュメント: SmsManager


1. システムを呼び出してテキスト メッセージを送信します。

は、書き込まれた受信者とコンテンツをシステムのテキスト メッセージ送信インターフェイスに送信します。ユーザーは、クリックする前に受信者のコンテンツが正しいかどうかを確認します。送信! 率直に言うと、これはシステムのテキスト メッセージング ウィンドウを呼び出すことです。これには、次のような利点があります。

この方法でテキスト メッセージを送信すると、テキスト メッセージを送信するための権限を 1 つ減らすことができ、その後セキュリティが向上します。アプリをインストールすると、360 などのソフトウェアもインストールされます。 ユーザーには、「このアプリには SMS 権限があり、テキスト メッセージを密かに送信する可能性があります。」という通知は表示されません。また、ユーザーはテキスト メッセージを密かに送信することを非常に懸念しています。 もちろん、何も見ずにインストールする人もいますし、こっそりテキストメッセージを送信できると考える人もいるかもしれません。 または、アプリがテキストメッセージを送信することを直接禁止すると、アプリがテキストメッセージを送信するときに何らかの異常が発生する可能性があります。 アプリケーションが直接クラッシュするなどです。したがって、アプリケーションが確認または支払いのために SMS を送信する必要がある場合は、この方法を使用することをお勧めします。

コア コード:

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. SMS を送信するには、システムが提供する SMS インターフェイスを呼び出します。テキスト メッセージを送信する許可が必要です

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

テキスト メッセージを送信するには、SmsManager が提供する SMS インターフェイスを直接呼び出します:

sendTextMessage

( destinationAddress、scAddress、text、sentIntent、deliverIntent);

パラメータは:

  • destinationAddress: 受信者の電話番号
  • scAddress: SMS センターの番号 (null の場合、現在のデフォルトの SMS サービス センターを使用します)
  • text: SMS コンテンツ
  • sentIntent: 情報SMS送信状況について:(インテント送信状況) null でない場合、この PendingIntent は、メッセージの送信が成功または失敗したときにブロードキャストされます。結果コードは Activity.RESULT_OK です。 成功、または RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、RESULT_ERROR_NULL_PDU を示します 1 はエラーを示します。 RESULT_ERROR_GENERIC_FAILURE に対応して、sentIntent には追加の「エラー コード」が含まれる場合があります。 無線技術に固有の値で、通常は誤動作を修復する場合にのみ役立ちます。すべての SMS ベースのアプリケーションは、sentIntent の検出を制御します。 sendIntent が空の場合、呼び出し元はすべての不明なアプリケーションを検出するため、検出時に送信される SMS の数が少なくなります。
  • deliverIntent: テキストメッセージが相手に受信されたかどうかのステータス情報:(受信ステータスの意図) null でない場合、このメッセージが受信者に送信されると、PendingIntent がブロードキャストされます。 ステータス レポートによって生成された pdu (ピア レベル間で転送されるデータ ユニットを指す) は、データ (「pdu」) に展開されます

1.jpg... とても複雑です、pdu とは何ですか?心配しないでください。次のパラメータだけは知っておいてください:

電話番号、メッセージ センター、テキスト メッセージの内容、送信が成功したかどうかの監視、受信者が監視を受け入れるかどうか。

コアコード

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);    
    }  
}

テキストメッセージが正常に送信されたかどうか、または受信者がメッセージを受信したかどうかを監視する必要がある場合もあります。以下を追加するだけです:

1) 返される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));
を処理します。送信ステータス

2) 受信ステータスを返す deliverIntent を処理します:

//处理返回的接收状态   
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));

さらに、これにはブロードキャストの知識が含まれます:

Android の基本入門チュートリアル - BroadcastReceiver 初心者向けトライアル

Android の基本的な入門チュートリアル - 4.3.2 BroadcastReceiver庖丁解牛


このセクションの概要:

2.gif さて、このセクションでは、SmsManager がテキスト メッセージを送信する 2 つの方法を紹介します~非常にシンプル〜使用をお勧めします 最初のオプション、少なくともユーザーエクスペリエンスは優れています...