[Android实例] android如何监听发送短信?

时间:2022-02-27 08:55:14

http://www.eoeandroid.com/thread-8990-1-1.html


我们知道,android中可以通过设置写一个继承自BroadcastReceiver的Receiver来重写

接收到短信之后的逻辑处理,如下:

  1. <receiver android:name=".filter.SmsReceiver"> 
  2. <intent-filter>
  3. <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  4. </intent-filter>
  5. </receiver>

复制代码



但是,如果要在发送短信后,进入到我们自己的一段逻辑。那么怎么做到监听,发送短信呢?

试过拦截,send,sendto 都无法做到?

  1. <intent-filter>
  2.                 <action android:name="android.intent.action.SENDTO"/>              
  3.                 <action android:name="android.intent.action.SEND"/>   
  4.                 <category android:name="android.intent.category.DEFAULT"/>           
  5. </intent-filter>

复制代码



难道没有办法做到监听短信发送?


按照楼上的楼上的思路,

测试使用ContentObserver ,观察"content://sms"的变化,调用重写的onChange方法,确实可以监听到

短信记录的变化,这样确实可以监听发短信!而且在此方法内,同样也是可以监听收短信的。

thanks !



回楼上:先写一个观察者:

  1. public class SmsObserver extends ContentObserver {        
  2.         private Context context;
  3.         private static final String[] SMS_PROJECTION = new String[] {
  4.                "address","person","date","type","body",
  5.             };
  6.         public SmsObserver(Context context,Handler handler) {
  7.                 super(handler);                
  8.                 this.context = context;
  9.                 Log.i("Leo-SmsObserver", "My Oberver on create");
  10.         }
  11.         
  12.         public void onChange (boolean selfChange) {
  13.                 Log.i("SmsObserver", "sms onChange###### ");                
  14.         }
  15. }

复制代码

然后在Acitivty或Service里注册这个观察者

  1. getContentResolver().registerContentObserver(Uri.parse("content://sms"),
  2.                                 true, new SmsObserver(this, new Handler()));

复制代码

当收发短信时,会调用onChange方法


-------------------

找了一个例子发现另外一个方法,可以自定义BroadcastReceiver来实现~

  1. SmsManager smsManager = SmsManager.getDefault();
  2.         
  3.         // TODO Auto-generated method stub
  4.         try
  5.         {
  6.           /* 创建自定义Action常数的Intent(给PendingIntent参数之用) */
  7.           Intent itSend = new Intent(SMS_SEND_ACTIOIN);
  8.           Intent itDeliver = new Intent(SMS_DELIVERED_ACTION);
  9.           
  10.           /* sentIntent参数为传送后接受的广播信息PendingIntent */
  11.           PendingIntent mSendPI = PendingIntent.getBroadcast
  12.           (getApplicationContext(), 0, itSend, 0);
  13.           
  14.           /* deliveryIntent参数为送达后接受的广播信息PendingIntent */
  15.           PendingIntent mDeliverPI = PendingIntent.getBroadcast
  16.           (getApplicationContext(), 0, itDeliver, 0);
  17.           
  18.           /* 发送SMS短信,注意倒数的两个PendingIntent参数 */
  19.           smsManager.sendTextMessage
  20.           (strDestAddress, null, strMessage, mSendPI, mDeliverPI);
  21.           
  22.           mTextView01.setText(R.string.str_sms_sending);
  23.         }
  24.         catch(Exception e)
  25.         {
  26.           mTextView01.setText(e.toString());
  27.           e.printStackTrace();
  28.         }

复制代码

  1. /* 自定义mServiceReceiver覆盖BroadcastReceiver聆听短信状态信息 */
  2.   public class mServiceReceiver extends BroadcastReceiver
  3.   {
  4.     @Override
  5.     public void onReceive(Context context, Intent intent)
  6.     {
  7.       // TODO Auto-generated method stub
  8.       
  9.       try
  10.       {
  11.         /* android.content.BroadcastReceiver.getResultCode()方法 */
  12.         switch(getResultCode())
  13.         {
  14.           case Activity.RESULT_OK:
  15.             /* 发送短信成功,这里写需要的代码*/
  16.             //mTextView01.setText(R.string.str_sms_sent_success);
  17.             mMakeTextToast
  18.             (
  19.               getResources().getText
  20.               (R.string.str_sms_sent_success).toString(),
  21.               true
  22.             );
  23.             break;
  24.           case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
  25.             /* 发送短信失败 */
  26.             //mTextView01.setText(R.string.str_sms_sent_failed);
  27.             mMakeTextToast
  28.             (
  29.               getResources().getText
  30.               (R.string.str_sms_sent_failed).toString(),
  31.               true
  32.             );
  33.             break;
  34.           case SmsManager.RESULT_ERROR_RADIO_OFF:
  35.             break;
  36.           case SmsManager.RESULT_ERROR_NULL_PDU:
  37.             break;
  38.         }        
  39.       }
  40.       catch(Exception e)
  41.       {
  42.         mTextView01.setText(e.toString());
  43.         e.getStackTrace();
  44.       }
  45.     }
  46.   }

复制代码


----------

send:是否发出

delivery:是否成功投递到收件人

  1. package lab.sodino.smslistener;
  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.view.View;
  11. import android.view.ViewGroup.LayoutParams;
  12. import android.widget.Button;
  13. import android.widget.LinearLayout;
  14. import android.widget.TextView;
  15. public class SmsAct extends Activity {
  16.         private TextView textView;
  17.         private static String ACTION_SMS_SEND = "lab.sodino.sms.send";
  18.         private static String ACTION_SMS_DELIVERY = "lab.sodino.sms.delivery";
  19.         private SMSReceiver sendReceiver;
  20.         private SMSReceiver deliveryReceiver;
  21.         public class SMSReceiver extends BroadcastReceiver {
  22.                 public void onReceive(Context context, Intent intent) {
  23.                         String actionName = intent.getAction();
  24.                         int resultCode = getResultCode();
  25.                         if (actionName.equals(ACTION_SMS_SEND)) {
  26.                                 switch (resultCode) {
  27.                                 case Activity.RESULT_OK:
  28.                                         textView.append("\n[Send]SMS Send:Successed!");
  29.                                         break;
  30.                                 case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
  31.                                         textView
  32.                                                         .append("\n[Send]SMS Send:RESULT_ERROR_GENERIC_FAILURE!");
  33.                                         break;
  34.                                 case SmsManager.RESULT_ERROR_NO_SERVICE:
  35.                                         textView
  36.                                                         .append("\n[Send]SMS Send:RESULT_ERROR_NO_SERVICE!");
  37.                                         break;
  38.                                 case SmsManager.RESULT_ERROR_NULL_PDU:
  39.                                         textView.append("\n[Send]SMS Send:RESULT_ERROR_NULL_PDU!");
  40.                                         break;
  41.                                 case SmsManager.RESULT_ERROR_RADIO_OFF:
  42.                                         break;
  43.                                 }
  44.                         } else if (actionName.equals(ACTION_SMS_DELIVERY)) {
  45.                                 switch (resultCode) {
  46.                                 case Activity.RESULT_OK:
  47.                                         textView.append("\n[Delivery]SMS Delivery:Success!");
  48.                                         break;
  49.                                 case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
  50.                                         textView
  51.                                                         .append("\n[Delivery]SMS Delivery:RESULT_ERROR_GENERIC_FAILURE!");
  52.                                         break;
  53.                                 case SmsManager.RESULT_ERROR_NO_SERVICE:
  54.                                         textView
  55.                                                         .append("\n[Delivery]SMS Delivery:RESULT_ERROR_NO_SERVICE!");
  56.                                         break;
  57.                                 case SmsManager.RESULT_ERROR_NULL_PDU:
  58.                                         textView
  59.                                                         .append("\n[Delivery]SMS Delivery:RESULT_ERROR_NULL_PDU!");
  60.                                         break;
  61.                                 case SmsManager.RESULT_ERROR_RADIO_OFF:
  62.                                         textView
  63.                                                         .append("\n[Delivery]SMS Delivery:RESULT_ERROR_RADIO_OFF!");
  64.                                         break;
  65.                                 }
  66.                         }
  67.                 }
  68.         }
  69.         /** Called when the activity is first created. */
  70.         @Override
  71.         public void onCreate(Bundle savedInstanceState) {
  72.                 super.onCreate(savedInstanceState);
  73.                 Button btn = new Button(this);
  74.                 btn.setOnClickListener(new Button.OnClickListener() {
  75.                         public void onClick(View v) {
  76.                                 sendSMS();
  77.                         }
  78.                 });
  79.                 textView = new TextView(this);
  80.                 textView.setBackgroundColor(0xffffffff);
  81.                 textView.setTextColor(0xff0000ff);
  82.                 textView.setText("SMS processing...");
  83.                 btn.setText("发送短信");
  84.                 LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(
  85.                                 LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
  86.                 LinearLayout linear = new LinearLayout(this);
  87.                 linear.setOrientation(LinearLayout.VERTICAL);
  88.                 linear.setLayoutParams(textParams);
  89.                 linear.addView(btn);
  90.                 linear.addView(textView);
  91.                 setContentView(linear);
  92.                 sendReceiver = new SMSReceiver();
  93.                 IntentFilter sendFilter = new IntentFilter(ACTION_SMS_SEND);
  94.                 registerReceiver(sendReceiver, sendFilter);
  95.                 deliveryReceiver = new SMSReceiver();
  96.                 IntentFilter deliveryFilter = new IntentFilter(ACTION_SMS_DELIVERY);
  97.                 registerReceiver(deliveryReceiver, deliveryFilter);
  98.         }
  99.         private void sendSMS() {
  100.                 String smsAddress = "10086";
  101.                 String smsBody = "bylcx";
  102.                 SmsManager smsMag = SmsManager.getDefault();
  103.                 Intent sendIntent = new Intent(ACTION_SMS_SEND);
  104.                 PendingIntent sendPI = PendingIntent.getBroadcast(this, 0, sendIntent,
  105.                                 0);
  106.                 Intent deliveryIntent = new Intent(ACTION_SMS_DELIVERY);
  107.                 PendingIntent deliveryPI = PendingIntent.getBroadcast(this, 0,
  108.                                 deliveryIntent, 0);
  109.                 smsMag.sendTextMessage(smsAddress, null, smsBody, sendPI, deliveryPI);
  110.         }
  111.         protected void onPaused() {
  112.                 unregisterReceiver(sendReceiver);
  113.                 unregisterReceiver(deliveryReceiver);
  114.         }
  115. }

复制代码


------------


public void onChange(boolean selfChange) {

// TODO Auto-generated method stub

super.onChange(selfChange);

//读取收件箱中指定号码的短信

cursor = managedQuery(Uri.parse("content://sms/inbox"), new String[]{"_id", "address", "read"}, " address=? and read=?", new String[]{"138xxxxxxxx", "0"}, "date desc");

if (cursor != null){

ContentValues values = new ContentValues();

values.put("read", "1"); //修改短信为已读模式

cursor.moveToFirst();

while (cursor.isLast()){

//更新当前未读短信状态为已读

getContentResolver().update(Uri.parse("content://sms/inbox"), values, " _id=?", new String[]{""+cursor.getInt(0)});

cursor.moveToNext();



---------

找了一个例子发现另外一个方法,可以自定义BroadcastReceiver来实现~


这个是监视短信发送的状态报告的吧,和楼主的 监视短信的发送 要求不一致。



----------