接收短信
- 接收短信的Action为android.provider.Telephony.SMS_RECEIVED
public class MainActivity extends AppCompatActivity {
private TextView textView_msgNum,textView_msgContent;
private MyMsgReceiver myMsgReceiver;
private IntentFilter receiveFilter;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
receiveFilter.setPriority(100);
registerReceiver(myMsgReceiver, receiveFilter);
}
private void init() {
textView_msgNum= (TextView) findViewById(R.id.textView_msgNum);
textView_msgContent= (TextView) findViewById(R.id.textView_msgContent);
myMsgReceiver=new MyMsgReceiver();
receiveFilter =new IntentFilter();
}
class MyMsgReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle=intent.getExtras();
//提取短信消息
Object[] pdus= (Object[]) bundle.get("pdus");
SmsMessage[] msgs=new SmsMessage[pdus.length];
for (int i=0;i<msgs.length;i++){
msgs[i]=SmsMessage.createFromPdu((byte[]) pdus[i]);
}
String address=msgs[0].getOriginatingAddress();
String content="";
for (SmsMessage msg:msgs){
content+=msg.getMessageBody();
}
textView_msgNum.setText(address);
textView_msgContent.setText(content);
abortBroadcast();
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
unregisterReceiver(myMsgReceiver);
}
}
- 记得在androidManifest文件中添加接收短信的权限
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
- 创建一个内部类MyMsgReceiver 广播接收器,并在其中写接收短信的逻辑代码
class MyMsgReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle=intent.getExtras();
//提取短信消息
Object[] pdus= (Object[]) bundle.get("pdus");
SmsMessage[] msgs=new SmsMessage[pdus.length];
for (int i=0;i<msgs.length;i++){
//将pdu字节数组转换为SmsMessage对象
msgs[i]=SmsMessage.createFromPdu((byte[]) pdus[i]);
}
//获取发信人号码
String address=msgs[0].getOriginatingAddress();
String content="";
for (SmsMessage msg:msgs){
//获取短信内容
content+=msg.getMessageBody();
}
textView_msgNum.setText(address);
textView_msgContent.setText(content);
abortBroadcast();
}
}
- 据说将receiveFilter.setPriority(100);,再通过abortBroadcast();将广播截断,系统短信就不会再接收到短信,这就是拦截短息的原理
- 但是我试了不行,不知道为什么。。。。。。。。。
发送短信
- 发送短信的权限为
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
- 发送短信的逻辑代码如下
- 实现在点击发送按钮的时候,将短信发送出去的功能,顺便通过广播的方式来反馈给用户,是否发送成功
public class MainActivity extends AppCompatActivity {
private TextView textView_msgNum,textView_msgContent;
private IntentFilter sendFilter;
private EditText editText_msgNum,editText_msgContent;
private Button button_send;
private SendStatusReceiver sendStatusReceiver;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
sendFilter.addAction("SEND_SMS_ACTION");
registerReceiver(sendStatusReceiver,sendFilter);
button_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("SEND_SMS_ACTION");
PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this,0,intent,0);
SmsManager manager=SmsManager.getDefault();
manager.sendTextMessage(editText_msgNum.getText().toString(),null,editText_msgContent.getText().toString(),pendingIntent,null);
}
});
}
private void init() {
editText_msgNum= (EditText) findViewById(R.id.editView_msgNum);
editText_msgContent= (EditText) findViewById(R.id.editView_msgContent);
button_send= (Button) findViewById(R.id.button_send);
sendStatusReceiver=new SendStatusReceiver();
sendFilter=new IntentFilter();
}
class SendStatusReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if (getResultCode()==RESULT_OK){
Toast.makeText(MainActivity.this, "发送成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "发送失败", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
unregisterReceiver(sendStatusReceiver);
}
}
- 首先我们来开点击事件中的逻辑代码
Intent intent=new Intent("SEND_SMS_ACTION");
PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this,0,intent,0);
SmsManager manager=SmsManager.getDefault();
manager.sendTextMessage(editText_msgNum.getText().toString(),null,editText_msgContent.getText().toString(),pendingIntent,null);
- 首先我们通过SmsManager.getDefault()来获取SmsManager的实例,
- 然后通过sendTextMessage()方法发送信息,此方法接收五个参数
- 第一个参数用于指定接收人的手机号码
- 第三个参数用于指定短信的内容
- 第四个参数是一个PendingIntent对象,用于开启广播接收器,监控短信发送状态
其它参数我们暂时不用,传入null
为了了解短信是否发送成功,我们需要自定义一个监视发送状态的广播接收器,通过PendingIntent开启监控的广播,在广播中进行发送状态的判断,并吐司提示用户。
效果图