短信(一)
2015-12-16 10:34
411 查看
本篇介绍android短信的接收,发送和拦截
当手机收到短信时,系统会发送一条广播android.provider.Telephony.SMS_RECEIVED,所以我们写一个接收器,当收到广播时去获取短信的内容就好(发现有一些app在获取验证码时会自动将短信中的验证码提取出来填上,很方便,估计就是这么做的)
Class SmsReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent){
Bundle bundle = intent.getExtras();//里面存了短信信息
Object[] pdus = (Object[])bundle.get("pdus");//把短信内容拿出来
SmsMessage smsMessages = new SmsMessage[pdus.length];
for(int i=0 ; i<smsMessages.length ; i++){
smsMessages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);//这两个数组是一一对应的
}
String tel_sender = smsMessages[0].getOriginatingAddress();//获取发送方的电话号
StringBuffer content = new StringBuffer();//用于存放短信的内容
for(SmsMessage smsMessage : smsMessages){
content .append(smsMessage.getMessageBody());//获取短信内容
}
}
}
注意导包时import android.telephony.SmsMessage; 不要导gsm.SmsMessage,这个包已经废弃了
(简单说下StringBuffer与StringBuilder的区别,StringBuffer线程安全,StringBuilder线程不安全,但StringBuilder效率比StringBuffer高一些)
以上就是广播接收器的代码了,获取到的东西大家可以随意放到布局中,布局代码就不放上了,随便发挥。
千万别忘了加权限<uses-permission android:name="android.permission.RECEIVE_SMS"/>
广播动态注册:
IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
SmsReceiver receiver = new SmsReceiver();
registerReceiver(receiver,filter);
广播静态注册,在AndroidManifest.xml的application中:
<receiver android.name=".SmsReceiver">
<intent-filter>
<action android.name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
在onDestroy中unregisterReceiver(receiver);注销掉
发送短信和接收差不太多,有几个不同点
发送的action是SENT_SMS_ACTION,即filter.addAction("SENT_SMS_ACTION");
比如我们用一个button控制发送短信,则在onclick里可以这么写
SmsManager manager = SmsManager.getDefault();
Intent intent = new Intent("SENT_SMS_ACTION");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,int requestCode,intent,int flag);//requestCode随便写应该就可以,flag在介绍Notification的文章中已经说过了,这里不再赘述
manager.sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent);//最重要的发送
destinationAddress:这是你要发送给的那个电话号
scAddress:短信中心号码,传null则为默认中心号码(一般是null,不知道有多大用处)
text:短信的内容
sendIntent:把上面的intent放上就行
deliveryIntent:当消息发送到对方手机时这个intent会被广播(也是PendingIntent)
如果想知道是否发送成功则可以在发送的广播接收onReceive中判断getResultCode如果和RESULT_OK相等,则则成功了
短信广播是有序广播,所以我们可以拦截掉
加上filter.setPriority(int值);给个优先级然后在onReceive中调用abortBroadcast();中断广播就好了
先说这么多,感谢大家支持。
当手机收到短信时,系统会发送一条广播android.provider.Telephony.SMS_RECEIVED,所以我们写一个接收器,当收到广播时去获取短信的内容就好(发现有一些app在获取验证码时会自动将短信中的验证码提取出来填上,很方便,估计就是这么做的)
Class SmsReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent){
Bundle bundle = intent.getExtras();//里面存了短信信息
Object[] pdus = (Object[])bundle.get("pdus");//把短信内容拿出来
SmsMessage smsMessages = new SmsMessage[pdus.length];
for(int i=0 ; i<smsMessages.length ; i++){
smsMessages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);//这两个数组是一一对应的
}
String tel_sender = smsMessages[0].getOriginatingAddress();//获取发送方的电话号
StringBuffer content = new StringBuffer();//用于存放短信的内容
for(SmsMessage smsMessage : smsMessages){
content .append(smsMessage.getMessageBody());//获取短信内容
}
}
}
注意导包时import android.telephony.SmsMessage; 不要导gsm.SmsMessage,这个包已经废弃了
(简单说下StringBuffer与StringBuilder的区别,StringBuffer线程安全,StringBuilder线程不安全,但StringBuilder效率比StringBuffer高一些)
以上就是广播接收器的代码了,获取到的东西大家可以随意放到布局中,布局代码就不放上了,随便发挥。
千万别忘了加权限<uses-permission android:name="android.permission.RECEIVE_SMS"/>
广播动态注册:
IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
SmsReceiver receiver = new SmsReceiver();
registerReceiver(receiver,filter);
广播静态注册,在AndroidManifest.xml的application中:
<receiver android.name=".SmsReceiver">
<intent-filter>
<action android.name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
在onDestroy中unregisterReceiver(receiver);注销掉
发送短信和接收差不太多,有几个不同点
发送的action是SENT_SMS_ACTION,即filter.addAction("SENT_SMS_ACTION");
比如我们用一个button控制发送短信,则在onclick里可以这么写
SmsManager manager = SmsManager.getDefault();
Intent intent = new Intent("SENT_SMS_ACTION");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,int requestCode,intent,int flag);//requestCode随便写应该就可以,flag在介绍Notification的文章中已经说过了,这里不再赘述
manager.sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent);//最重要的发送
destinationAddress:这是你要发送给的那个电话号
scAddress:短信中心号码,传null则为默认中心号码(一般是null,不知道有多大用处)
text:短信的内容
sendIntent:把上面的intent放上就行
deliveryIntent:当消息发送到对方手机时这个intent会被广播(也是PendingIntent)
如果想知道是否发送成功则可以在发送的广播接收onReceive中判断getResultCode如果和RESULT_OK相等,则则成功了
短信广播是有序广播,所以我们可以拦截掉
加上filter.setPriority(int值);给个优先级然后在onReceive中调用abortBroadcast();中断广播就好了
先说这么多,感谢大家支持。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories