[Android实例] android如何监听发送短信?
2015-02-23 17:34
453 查看
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来实现~ 这个是监视短信发送的状态报告的吧,和楼主的 监视短信的发送 要求不一致。 |
相关文章推荐
- android如何监听发送短信?
- (转)android如何监听发送短信
- Android监听器之监听短信发送消息实例
- Android自定义发送短信实例
- Android监听SMS发送状态并获取短信服务中心号码
- [Android实例] android 发送短信和打电话
- 【Android学习日记】(七) 监听短信接收实例
- Android发送短信以及监听发送状态
- 在Android中发送短信和彩信,监听短信并显示
- android手机短信监听器,监听到的短信发送到web服务器,完整源码分享
- Android发送短信,并监听短信发送后是否发送成功的实现方法
- Android监听SMS发送状态并获取短信服务中心号码
- 在android里如何代码调用系统短信发送界面
- Android外部监听类-发送短信程序
- 在Android中发送短信和彩信,监听短信并显示
- Android 简单发送短信实例
- 如何在模拟器上向android发送短信和拨打电话?
- Android如何实现后台发送短信
- 举例说明android如何实现发送短信的功能
- android发送短信实例