SmsManager(SMS Manager)


Pengenalan kepada bahagian ini:

Bahagian ini memperkenalkan SmsManager (Pengurus Mesej Ringkas) dalam Android Seperti namanya, ia digunakan untuk mengurus mesej teks telefon mudah alih. Tidak banyak senario aplikasi jenis ini Secara amnya, kami hanya menggunakan API ini apabila menghantar mesej teks Mesej teks terlalu rumit untuk MMS, dan dalam era QQ, WeChat dan pelbagai aplikasi sosial berleluasa, anda akan menghantar satu untuk 1 yuan. MMS? Jadi dalam bahagian ini kita hanya membincangkan menghantar mesej teks biasa! Dokumen rasmi: SmsManager


1 Panggil sistem untuk menghantar mesej teks:

adalah untuk menghantar penerima bertulis dan kandungan kepada. Antara muka sistem untuk menghantar mesej teks memerlukan pengguna untuk mengesahkan sama ada kandungan penerima sememangnya betul sebelum mengklik hantar! Secara terang-terangan, ia adalah untuk memanggil tetingkap sistem untuk menghantar mesej teks Ini mempunyai kelebihan tertentu:

Hantar mesej teks dengan cara ini, apabila apl dipasang, anda boleh menulis satu kebenaran untuk menghantar mesej teks, kemudian seperti 360 Apabila memasang perisian keselamatan jenis ini Pengguna tidak akan diingatkan: "APP ini mempunyai kebenaran SMS dan mungkin menghantar mesej teks secara rahsia." Memang menjijikkan, sesetengah orang memasangnya tanpa melihatnya, dan sesetengah orang mungkin berfikir ia boleh menghantar mesej teks secara rahsia. Saya tidak akan berpura-pura. Atau melarang terus APP kami daripada menghantar mesej teks, maka beberapa keabnormalan mungkin berlaku apabila APP kami menghantar mesej teks, atau Aplikasi ranap secara langsung dan sebagainya! Jadi jika permohonan anda perlu menghantar SMS untuk pengesahan atau pembayaran, adalah disyorkan untuk menggunakan kaedah ini

Kod teras:

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! . Hubungi antara muka SMS yang disediakan oleh sistem untuk menghantar mesej teks

Ini memerlukan kebenaran untuk menghantar mesej teks

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

Kami terus menghubungi antara muka SMS yang disediakan oleh SmsManager untuk menghantar mesej teks:

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

Parameter mengikut urutan ialah:

  • destinationAddress: Nombor telefon penerima
  • scAddress: Nombor pusat SMS, jika batal, gunakan perkhidmatan SMS lalai semasa center
  • teks: Kandungan SMS
  • sentIntent: Maklumat status penghantaran SMS: (Niat menghantar status) Jika tidak batal, PendingIntent ini disiarkan apabila mesej berjaya dihantar atau gagal. Kod hasil ialah Activity.RESULT_OK Menunjukkan kejayaan, atau RESULT_ERROR_GENERIC_FAILURE, RESULT_ERROR_RADIO_OFF, RESULT_ERROR_NULL_PDU Satu menunjukkan ralat. Sepadan dengan RESULT_ERROR_GENERIC_FAILURE, sentIntent mungkin termasuk "kod ralat" tambahan yang mengandungi Nilai khusus teknologi radio yang biasanya hanya berguna apabila membetulkan kerosakan. Setiap aplikasi berasaskan SMS mengawal pengesanan sentIntent. Jika sentIntent kosong, pemanggil akan mengesan semua aplikasi yang tidak diketahui, yang akan menyebabkan bilangan SMS yang lebih kecil dihantar apabila dikesan.
  • deliverIntent: Maklumat status sama ada mesej teks telah diterima oleh pihak lain: (Niat untuk menerima status) Jika tidak batal, apabila mesej ini dihantar kepada penerima, PendingIntent akan disiarkan. Pdu yang dijana oleh laporan status (merujuk kepada unit data yang dipindahkan antara peringkat rakan sebaya) akan dikembangkan kepada data ("pdu")

1.jpg...Sangat rumit, apa adakah telur pdu? Nah, jangan risau, hanya tahu parameter ini:

nombor telefon, pusat maklumat, kandungan mesej teks, memantau sama ada penghantaran berjaya dan sama ada penerima menerima pemantauan!

Kod teras

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

Mungkin anda juga perlu memantau sama ada mesej teks berjaya dihantar atau sama ada penerima menerima mesej tersebut, jadi tambahkan sahaja perkara berikut :

1) Proses 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));

yang mengembalikan status penghantaran; 2) Proseskan deliverIntent yang mengembalikan status penerima:

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

Selain itu Ini melibatkan pengetahuan penyiaran Jika anda tidak tahu banyak tentang penyiaran, anda boleh lihat:

Tutorial Pengenalan Asas Android - Percubaan Awesome BroadcastReceiver.

Tutorial pengenalan Asas Android - 4.3.2 BroadcastReceiver庖丁杰牛


Ringkasan bahagian ini:

2.gif Okay, bahagian ini memperkenalkan SmsManager untuk menghantar teks Terdapat dua cara untuk menghantar mesej teks~sangat mudah~disyorkan untuk digunakan Pilihan pertama, sekurang-kurangnya pengalaman pengguna adalah lebih baik...