您的位置:首页 > 移动开发 > Android开发

[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来实现~

这个是监视短信发送的状态报告的吧,和楼主的 监视短信的发送 要求不一致。
----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: