Android监听SMS发送状态并获取短信服务中心号码

监听SMS发送状态的例子网上虽然有,但还是太杂了不完全。自己写了个。

短信服务中心号码的获取是通过SmsMessage.getServiceCenterAddress()方法获得。也就是只能从已经存储在你手机 上的短信中获取。本例子获取短信服务号码的思路是发送一个自定义字符串到10086去,拦截10086下行的短信从中读取短信服务号码。测试后发现虽然在 本手机卡为深圳号,但收到的短信服务中心号码却是佛山的。但至少知道是处于哪个省了。

全国短信服务中心号码详见:http://zdm2008.blog.163.com/blog/static/20491545201062210921272/

另外一份详细的中国联通的短信服务中心号码详见:http://wenku.baidu.com/view/7acddc1b6bd97f192279e9c0.html

本例子还用Java代码实现布局。

send:短信是否发送出去。

delivery:短信是否发送到收件人中。

  1. package  lab.sodino.servicecenteraddress;  
  2. import  android.app.Activity;  
  3. import  android.app.PendingIntent;  
  4. import  android.content.BroadcastReceiver;  
  5. import  android.content.Context;  
  6. import  android.content.Intent;  
  7. import  android.content.IntentFilter;  
  8. import  android.os.Bundle;  
  9. import  android.telephony.gsm.SmsManager;  
  10. import  android.telephony.gsm.SmsMessage;  
  11. import  android.view.Gravity;  
  12. import  android.view.View;  
  13. import  android.widget.Button;  
  14. import  android.widget.LinearLayout;  
  15. import  android.widget.TextView;  
  16. import  android.widget.LinearLayout.LayoutParams;  
  17. public   class  ServiceCenterAddressAct  extends  Activity {  
  18.     private   static   final  String ACTION_SMS_SEND =  "lab.sodino.sms.send" ;  
  19.     private   static   final  String ACTION_SMS_DELIVERY =  "lab.sodino.sms.delivery" ;  
  20.     private   static   final  String ACTION_SMS_RECEIVER =  "android.provider.Telephony.SMS_RECEIVED" ;  
  21.     private  TextView serviceCenterAddressText;  
  22.     private  SMSReceiver sendReceiver;  
  23.     private  SMSReceiver deliveryReceiver;  
  24.     private  SMSReceiver smsReceiver;  
  25.     /** Called when the activity is first created. */   
  26.     @Override   
  27.     public   void  onCreate(Bundle savedInstanceState) {  
  28.         super .onCreate(savedInstanceState);  
  29.         LinearLayout.LayoutParams layParams = new  LinearLayout.LayoutParams(  
  30.                 LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);  
  31.         LinearLayout linearLay = new  LinearLayout( this );  
  32.         linearLay.setOrientation(LinearLayout.VERTICAL);  
  33.         linearLay.setLayoutParams(layParams);  
  34.         TextView textView = new  TextView( this );  
  35.         textView.setBackgroundColor(0xffffffff );  
  36.         textView.setTextColor(0xff0000ff );  
  37.         textView.setTextSize(20 );  
  38.         textView.setText("点击发送按钮将发送自定义字符串至10086" );  
  39.         textView.setGravity(Gravity.CENTER);  
  40.         linearLay.addView(textView);  
  41.         Button btnSend = new  Button( this );  
  42.         // LinearLayout.LayoutParams btnParams = new LinearLayout.LayoutParams(   
  43.         // LinearLayout.LayoutParams.FILL_PARENT,   
  44.         // LinearLayout.LayoutParams.WRAP_CONTENT);   
  45.         btnSend.setText("发送" );  
  46.         btnSend.setOnClickListener(new  Button.OnClickListener() {  
  47.             public   void  onClick(View v) {  
  48.                 serviceCenterAddressText.setText("正在等待发送短信..." );  
  49.                 sendSms();  
  50.             }  
  51.         });  
  52.         linearLay.addView(btnSend);  
  53.         serviceCenterAddressText = new  TextView( this );  
  54.         serviceCenterAddressText.setText("正在等待发送短信..." );  
  55.         serviceCenterAddressText.setBackgroundColor(0xffffffff );  
  56.         serviceCenterAddressText.setTextColor(0xff0000ff );  
  57.         serviceCenterAddressText.setTextSize(20 );  
  58.         serviceCenterAddressText.setGravity(Gravity.LEFT);  
  59.         linearLay.addView(serviceCenterAddressText);  
  60.         setContentView(linearLay);  
  61.         // 注册send   
  62.         sendReceiver = new  SMSReceiver();  
  63.         IntentFilter sendFilter = new  IntentFilter(ACTION_SMS_SEND);  
  64.         registerReceiver(sendReceiver, sendFilter);  
  65.         // 注册delivery   
  66.         deliveryReceiver = new  SMSReceiver();  
  67.         IntentFilter deliveryFilter = new  IntentFilter(ACTION_SMS_DELIVERY);  
  68.         registerReceiver(deliveryReceiver, deliveryFilter);  
  69.         // 注册接收下行receiver   
  70.         smsReceiver = new  SMSReceiver();  
  71.         IntentFilter receiverFilter = new  IntentFilter(ACTION_SMS_RECEIVER);  
  72.         registerReceiver(smsReceiver, receiverFilter);  
  73.     }  
  74.     protected   void  onPause() {  
  75.         unregisterReceiver(sendReceiver);  
  76.         unregisterReceiver(deliveryReceiver);  
  77.         unregisterReceiver(smsReceiver);  
  78.     }  
  79.     private   void  sendSms() {  
  80.         String smsBody = "lab.sodino.sms.test" ;  
  81.         String smsAddress = "10086" ;  
  82.         SmsManager smsMag = SmsManager.getDefault();  
  83.         Intent sendIntent = new  Intent(ACTION_SMS_SEND);  
  84.         PendingIntent sendPI = PendingIntent.getBroadcast(this0 , sendIntent,  
  85.                 0 );  
  86.         Intent deliveryIntent = new  Intent(ACTION_SMS_DELIVERY);  
  87.         PendingIntent deliveryPI = PendingIntent.getBroadcast(this0 ,  
  88.                 deliveryIntent, 0 );  
  89.         smsMag.sendTextMessage(smsAddress, null , smsBody, sendPI, deliveryPI);  
  90.     }  
  91.     public   class  SMSReceiver  extends  BroadcastReceiver {  
  92.         public   void  onReceive(Context context, Intent intent) {  
  93.             String actionName = intent.getAction();  
  94.             int  resultCode = getResultCode();  
  95.             if  (actionName.equals(ACTION_SMS_SEND)) {  
  96.                 switch  (resultCode) {  
  97.                 case  Activity.RESULT_OK:  
  98.                     serviceCenterAddressText  
  99.                             .append("\n[Send]SMS Send:Successed!" );  
  100.                     break ;  
  101.                 case  SmsManager.RESULT_ERROR_GENERIC_FAILURE:  
  102.                     serviceCenterAddressText  
  103.                             .append("\n[Send]SMS Send:RESULT_ERROR_GENERIC_FAILURE!" );  
  104.                     break ;  
  105.                 case  SmsManager.RESULT_ERROR_NO_SERVICE:  
  106.                     serviceCenterAddressText  
  107.                             .append("\n[Send]SMS Send:RESULT_ERROR_NO_SERVICE!" );  
  108.                     break ;  
  109.                 case  SmsManager.RESULT_ERROR_NULL_PDU:  
  110.                     serviceCenterAddressText  
  111.                             .append("\n[Send]SMS Send:RESULT_ERROR_NULL_PDU!" );  
  112.                     break ;  
  113.                 case  SmsManager.RESULT_ERROR_RADIO_OFF:  
  114.                     break ;  
  115.                 }  
  116.             } else   if  (actionName.equals(ACTION_SMS_DELIVERY)) {  
  117.                 switch  (resultCode) {  
  118.                 case  Activity.RESULT_OK:  
  119.                     serviceCenterAddressText  
  120.                             .append("\n[Delivery]SMS Delivery:Successed!" );  
  121.                     break ;  
  122.                 case  SmsManager.RESULT_ERROR_GENERIC_FAILURE:  
  123.                     serviceCenterAddressText  
  124.                             .append("\n[Delivery]SMS Delivery:RESULT_ERROR_GENERIC_FAILURE!" );  
  125.                     break ;  
  126.                 case  SmsManager.RESULT_ERROR_NO_SERVICE:  
  127.                     serviceCenterAddressText  
  128.                             .append("\n[Delivery]SMS Delivery:RESULT_ERROR_NO_SERVICE!" );  
  129.                     break ;  
  130.                 case  SmsManager.RESULT_ERROR_NULL_PDU:  
  131.                     serviceCenterAddressText  
  132.                             .append("\n[Delivery]SMS Delivery:RESULT_ERROR_NULL_PDU!" );  
  133.                     break ;  
  134.                 case  SmsManager.RESULT_ERROR_RADIO_OFF:  
  135.                     serviceCenterAddressText  
  136.                             .append("\n[Delivery]SMS Delivery:RESULT_ERROR_RADIO_OFF!" );  
  137.                     break ;  
  138.                 }  
  139.                 serviceCenterAddressText.append("\n正在等待下行短信..." );  
  140.             } else   if  (actionName.equals(ACTION_SMS_RECEIVER)) {  
  141.                 System.out.println("[Sodino]result = "  + resultCode);  
  142.                 Bundle bundle = intent.getExtras();  
  143.                 if  (bundle !=  null ) {  
  144.                     Object[] myOBJpdus = (Object[]) bundle.get("pdus" );  
  145.                     SmsMessage[] messages = new  SmsMessage[myOBJpdus.length];  
  146.                     for  ( int  i =  0 ; i < myOBJpdus.length; i++) {  
  147.                         messages[i] = SmsMessage  
  148.                                 .createFromPdu((byte []) myOBJpdus[i]);  
  149.                     }  
  150.                     SmsMessage message = messages[0 ];  
  151.                     serviceCenterAddressText.append("\n短信服务中心号码为:"   
  152.                             + message.getServiceCenterAddress());  
  153.                 }  
  154.             }  
  155.         }  
  156.     }  
  157. }  

package lab.sodino.servicecenteraddress; import android.app.Activity; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.telephony.gsm.SmsManager; import android.telephony.gsm.SmsMessage; import android.view.Gravity; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.LinearLayout.LayoutParams; public class ServiceCenterAddressAct extends Activity { private static final String ACTION_SMS_SEND = "lab.sodino.sms.send"; private static final String ACTION_SMS_DELIVERY = "lab.sodino.sms.delivery"; private static final String ACTION_SMS_RECEIVER = "android.provider.Telephony.SMS_RECEIVED"; private TextView serviceCenterAddressText; private SMSReceiver sendReceiver; private SMSReceiver deliveryReceiver; private SMSReceiver smsReceiver; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout.LayoutParams layParams = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); LinearLayout linearLay = new LinearLayout(this); linearLay.setOrientation(LinearLayout.VERTICAL); linearLay.setLayoutParams(layParams); TextView textView = new TextView(this); textView.setBackgroundColor(0xffffffff); textView.setTextColor(0xff0000ff); textView.setTextSize(20); textView.setText("点击发送按钮将发送自定义字符串至10086"); textView.setGravity(Gravity.CENTER); linearLay.addView(textView); Button btnSend = new Button(this); // LinearLayout.LayoutParams btnParams = new LinearLayout.LayoutParams( // LinearLayout.LayoutParams.FILL_PARENT, // LinearLayout.LayoutParams.WRAP_CONTENT); btnSend.setText("发送"); btnSend.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { serviceCenterAddressText.setText("正在等待发送短信..."); sendSms(); } }); linearLay.addView(btnSend); serviceCenterAddressText = new TextView(this); serviceCenterAddressText.setText("正在等待发送短信..."); serviceCenterAddressText.setBackgroundColor(0xffffffff); serviceCenterAddressText.setTextColor(0xff0000ff); serviceCenterAddressText.setTextSize(20); serviceCenterAddressText.setGravity(Gravity.LEFT); linearLay.addView(serviceCenterAddressText); setContentView(linearLay); // 注册send sendReceiver = new SMSReceiver(); IntentFilter sendFilter = new IntentFilter(ACTION_SMS_SEND); registerReceiver(sendReceiver, sendFilter); // 注册delivery deliveryReceiver = new SMSReceiver(); IntentFilter deliveryFilter = new IntentFilter(ACTION_SMS_DELIVERY); registerReceiver(deliveryReceiver, deliveryFilter); // 注册接收下行receiver smsReceiver = new SMSReceiver(); IntentFilter receiverFilter = new IntentFilter(ACTION_SMS_RECEIVER); registerReceiver(smsReceiver, receiverFilter); } protected void onPause() { unregisterReceiver(sendReceiver); unregisterReceiver(deliveryReceiver); unregisterReceiver(smsReceiver); } private void sendSms() { String smsBody = "lab.sodino.sms.test"; String smsAddress = "10086"; SmsManager smsMag = SmsManager.getDefault(); Intent sendIntent = new Intent(ACTION_SMS_SEND); PendingIntent sendPI = PendingIntent.getBroadcast(this, 0, sendIntent, 0); Intent deliveryIntent = new Intent(ACTION_SMS_DELIVERY); PendingIntent deliveryPI = PendingIntent.getBroadcast(this, 0, deliveryIntent, 0); smsMag.sendTextMessage(smsAddress, null, smsBody, sendPI, deliveryPI); } public class SMSReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { String actionName = intent.getAction(); int resultCode = getResultCode(); if (actionName.equals(ACTION_SMS_SEND)) { switch (resultCode) { case Activity.RESULT_OK: serviceCenterAddressText .append("\n[Send]SMS Send:Successed!"); break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: serviceCenterAddressText .append("\n[Send]SMS Send:RESULT_ERROR_GENERIC_FAILURE!"); break; case SmsManager.RESULT_ERROR_NO_SERVICE: serviceCenterAddressText .append("\n[Send]SMS Send:RESULT_ERROR_NO_SERVICE!"); break; case SmsManager.RESULT_ERROR_NULL_PDU: serviceCenterAddressText .append("\n[Send]SMS Send:RESULT_ERROR_NULL_PDU!"); break; case SmsManager.RESULT_ERROR_RADIO_OFF: break; } } else if (actionName.equals(ACTION_SMS_DELIVERY)) { switch (resultCode) { case Activity.RESULT_OK: serviceCenterAddressText .append("\n[Delivery]SMS Delivery:Successed!"); break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: serviceCenterAddressText .append("\n[Delivery]SMS Delivery:RESULT_ERROR_GENERIC_FAILURE!"); break; case SmsManager.RESULT_ERROR_NO_SERVICE: serviceCenterAddressText .append("\n[Delivery]SMS Delivery:RESULT_ERROR_NO_SERVICE!"); break; case SmsManager.RESULT_ERROR_NULL_PDU: serviceCenterAddressText .append("\n[Delivery]SMS Delivery:RESULT_ERROR_NULL_PDU!"); break; case SmsManager.RESULT_ERROR_RADIO_OFF: serviceCenterAddressText .append("\n[Delivery]SMS Delivery:RESULT_ERROR_RADIO_OFF!"); break; } serviceCenterAddressText.append("\n正在等待下行短信..."); } else if (actionName.equals(ACTION_SMS_RECEIVER)) { System.out.println("[Sodino]result = " + resultCode); Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] myOBJpdus = (Object[]) bundle.get("pdus"); SmsMessage[] messages = new SmsMessage[myOBJpdus.length]; for (int i = 0; i < myOBJpdus.length; i++) { messages[i] = SmsMessage .createFromPdu((byte[]) myOBJpdus[i]); } SmsMessage message = messages[0]; serviceCenterAddressText.append("\n短信服务中心号码为:" + message.getServiceCenterAddress()); } } } } }

最后要在AndroidManifest.xml中添加下面两个权限:

  1. < uses-permission   android:name = "android.permission.SEND_SMS" > </ uses-permission >   
  2. < uses-permission   android:name = "android.permission.RECEIVE_SMS" > </ uses-permission >  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值