http://www.eoeandroid.com/thread-8990-1-1.html
我们知道,android中可以通过设置写一个继承自BroadcastReceiver的Receiver来重写 接收到短信之后的逻辑处理,如下:
- <receiver android:name=".filter.SmsReceiver">
- <intent-filter>
- <action android:name="android.provider.Telephony.SMS_RECEIVED" />
- </intent-filter>
- </receiver>
复制代码 但是,如果要在发送短信后,进入到我们自己的一段逻辑。那么怎么做到监听,发送短信呢? 试过拦截,send,sendto 都无法做到?
- <intent-filter>
- <action android:name="android.intent.action.SENDTO"/>
- <action android:name="android.intent.action.SEND"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
复制代码 难道没有办法做到监听短信发送? |
按照楼上的楼上的思路, 测试使用ContentObserver ,观察"content://sms"的变化,调用重写的onChange方法,确实可以监听到 短信记录的变化,这样确实可以监听发短信!而且在此方法内,同样也是可以监听收短信的。 thanks ! |
回楼上:先写一个观察者:
- public class SmsObserver extends ContentObserver {
- private Context context;
- private static final String[] SMS_PROJECTION = new String[] {
- "address","person","date","type","body",
- };
- public SmsObserver(Context context,Handler handler) {
- super(handler);
- this.context = context;
- Log.i("Leo-SmsObserver", "My Oberver on create");
- }
-
- public void onChange (boolean selfChange) {
- Log.i("SmsObserver", "sms onChange###### ");
- }
- }
复制代码 然后在Acitivty或Service里注册这个观察者
- getContentResolver().registerContentObserver(Uri.parse("content://sms"),
- true, new SmsObserver(this, new Handler()));
复制代码 当收发短信时,会调用onChange方法 |
-------------------
找了一个例子发现另外一个方法,可以自定义BroadcastReceiver来实现~
- SmsManager smsManager = SmsManager.getDefault();
-
- // TODO Auto-generated method stub
- try
- {
- /* 创建自定义Action常数的Intent(给PendingIntent参数之用) */
- Intent itSend = new Intent(SMS_SEND_ACTIOIN);
- Intent itDeliver = new Intent(SMS_DELIVERED_ACTION);
-
- /* sentIntent参数为传送后接受的广播信息PendingIntent */
- PendingIntent mSendPI = PendingIntent.getBroadcast
- (getApplicationContext(), 0, itSend, 0);
-
- /* deliveryIntent参数为送达后接受的广播信息PendingIntent */
- PendingIntent mDeliverPI = PendingIntent.getBroadcast
- (getApplicationContext(), 0, itDeliver, 0);
-
- /* 发送SMS短信,注意倒数的两个PendingIntent参数 */
- smsManager.sendTextMessage
- (strDestAddress, null, strMessage, mSendPI, mDeliverPI);
-
- mTextView01.setText(R.string.str_sms_sending);
- }
- catch(Exception e)
- {
- mTextView01.setText(e.toString());
- e.printStackTrace();
- }
复制代码
- /* 自定义mServiceReceiver覆盖BroadcastReceiver聆听短信状态信息 */
- public class mServiceReceiver extends BroadcastReceiver
- {
- @Override
- public void onReceive(Context context, Intent intent)
- {
- // TODO Auto-generated method stub
-
- try
- {
- /* android.content.BroadcastReceiver.getResultCode()方法 */
- switch(getResultCode())
- {
- case Activity.RESULT_OK:
- /* 发送短信成功,这里写需要的代码*/
- //mTextView01.setText(R.string.str_sms_sent_success);
- mMakeTextToast
- (
- getResources().getText
- (R.string.str_sms_sent_success).toString(),
- true
- );
- break;
- case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
- /* 发送短信失败 */
- //mTextView01.setText(R.string.str_sms_sent_failed);
- mMakeTextToast
- (
- getResources().getText
- (R.string.str_sms_sent_failed).toString(),
- true
- );
- break;
- case SmsManager.RESULT_ERROR_RADIO_OFF:
- break;
- case SmsManager.RESULT_ERROR_NULL_PDU:
- break;
- }
- }
- catch(Exception e)
- {
- mTextView01.setText(e.toString());
- e.getStackTrace();
- }
- }
- }
复制代码 |
----------
send:是否发出 delivery:是否成功投递到收件人
- package lab.sodino.smslistener;
- 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.view.View;
- import android.view.ViewGroup.LayoutParams;
- import android.widget.Button;
- import android.widget.LinearLayout;
- import android.widget.TextView;
- public class SmsAct extends Activity {
- private TextView textView;
- private static String ACTION_SMS_SEND = "lab.sodino.sms.send";
- private static String ACTION_SMS_DELIVERY = "lab.sodino.sms.delivery";
- private SMSReceiver sendReceiver;
- private SMSReceiver deliveryReceiver;
- 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:
- textView.append("\n[Send]SMS Send:Successed!");
- break;
- case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
- textView
- .append("\n[Send]SMS Send:RESULT_ERROR_GENERIC_FAILURE!");
- break;
- case SmsManager.RESULT_ERROR_NO_SERVICE:
- textView
- .append("\n[Send]SMS Send:RESULT_ERROR_NO_SERVICE!");
- break;
- case SmsManager.RESULT_ERROR_NULL_PDU:
- textView.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:
- textView.append("\n[Delivery]SMS Delivery:Success!");
- break;
- case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
- textView
- .append("\n[Delivery]SMS Delivery:RESULT_ERROR_GENERIC_FAILURE!");
- break;
- case SmsManager.RESULT_ERROR_NO_SERVICE:
- textView
- .append("\n[Delivery]SMS Delivery:RESULT_ERROR_NO_SERVICE!");
- break;
- case SmsManager.RESULT_ERROR_NULL_PDU:
- textView
- .append("\n[Delivery]SMS Delivery:RESULT_ERROR_NULL_PDU!");
- break;
- case SmsManager.RESULT_ERROR_RADIO_OFF:
- textView
- .append("\n[Delivery]SMS Delivery:RESULT_ERROR_RADIO_OFF!");
- break;
- }
- }
- }
- }
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Button btn = new Button(this);
- btn.setOnClickListener(new Button.OnClickListener() {
- public void onClick(View v) {
- sendSMS();
- }
- });
- textView = new TextView(this);
- textView.setBackgroundColor(0xffffffff);
- textView.setTextColor(0xff0000ff);
- textView.setText("SMS processing...");
- btn.setText("发送短信");
- LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(
- LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
- LinearLayout linear = new LinearLayout(this);
- linear.setOrientation(LinearLayout.VERTICAL);
- linear.setLayoutParams(textParams);
- linear.addView(btn);
- linear.addView(textView);
- setContentView(linear);
- sendReceiver = new SMSReceiver();
- IntentFilter sendFilter = new IntentFilter(ACTION_SMS_SEND);
- registerReceiver(sendReceiver, sendFilter);
- deliveryReceiver = new SMSReceiver();
- IntentFilter deliveryFilter = new IntentFilter(ACTION_SMS_DELIVERY);
- registerReceiver(deliveryReceiver, deliveryFilter);
- }
- private void sendSMS() {
- String smsAddress = "10086";
- String smsBody = "bylcx";
- 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);
- }
- protected void onPaused() {
- unregisterReceiver(sendReceiver);
- unregisterReceiver(deliveryReceiver);
- }
- }
复制代码 |
------------
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来实现~ 这个是监视短信发送的状态报告的吧,和楼主的 监视短信的发送 要求不一致。 |
----------