android学习笔记——收发短信练习
来源:互联网 发布:淘宝运营怎么做 编辑:程序博客网 时间:2024/05/16 09:13
先来学习一下收短信。
收短信用到了我们之前学过的内容--广播机制。当手机收到一条短信时,会发送出一条值为“android.provider.Telephony.SMS_RECEIVED”的广播,这条广播里携带着与短信相关的所有数据。我们可以利用广播接收器将这条广播监听截取到,然后对这个内容进行解析(记住还要把广播截断,让系统本身收不到)。这样就完成了一个简单的短信接收。
1.写一个简单的布局
2.写好接收器,在onReceive()中做好短信内容的获取以及电话信息的获取。
3.在MainActivity中注册以及销毁
我们直接看2吧,在这里要做
public class MessageReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Object[] pdus = (Object[]) bundle.get("puds"); //提取短信消息
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0;i<messages.length;i++){
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
String address = messages[0].getOriginatingAddress();//获取发送方号码
String fullMessage = "";
for (SmsMessage message : messages){
fullMessage += message.getMessageBody();//获取短信内容
}
sender.setText(address);
content.setText(fullMessage);
}
}
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Object[] pdus = (Object[]) bundle.get("puds"); //提取短信消息
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0;i<messages.length;i++){
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
String address = messages[0].getOriginatingAddress();//获取发送方号码
String fullMessage = "";
for (SmsMessage message : messages){
fullMessage += message.getMessageBody();//获取短信内容
}
sender.setText(address);
content.setText(fullMessage);
}
}
从Intent中取出Bundle对象,使用puds秘钥来提取一个SMS pdus数组,其中每一个pdu都表示一条短信消息。接着使用SmsMessage的createFromPdu()方法将每一个pdu字节数组转换为SmsMessage对象。调用这个对象的getOriginatingAddress()方法就可以获取到短信的发送方号码,调用getMessageBody()方法就获取到短信的内容,拼起来就是完整的短信了。记得把他们放到界面的控件上去。
在MainActivity中要做的注册活动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sender = (TextView) findViewById(R.id.sender);
content = (TextView) findViewById(R.id.content);
receiverFilter = new IntentFilter();
receiverFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
messageReceiver = new MessageReceiver();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sender = (TextView) findViewById(R.id.sender);
content = (TextView) findViewById(R.id.content);
receiverFilter = new IntentFilter();
receiverFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
messageReceiver = new MessageReceiver();
registerReceiver(messageReceiver,receiverFilter);
}
这样就完成了一个简单的短信接收功能,还要记得注销操作,如果要做到短信的拦截记得设置高接收器的优先级,加上截断代码abortBroadcast(),还有就是权限的问题。
收短信权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
要想测试一下我们可以使用DDMS下的Emulator Control切换卡,可以给虚拟机做短信测试用(环境自带的虚拟机可用,Genymotion有些问题,没查出来,使用环境自带的先)
然后我们就可以考虑一下发短信了。
发短信其实是用到了SmsManager的一个sendTextMessage()这样的方法,就这么简单。
还是先来说明一下要做的工作
1.写一个布局(每次都特别简单就不写了)
2.拿到SmsManager的实例,调用sendTextMessage()方法
在正式写之前我们应该学会sendTextMessage()方法的参数
public void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
RESULT_ERROR_GENERIC_FAILURE
RESULT_ERROR_RADIO_OFF
RESULT_ERROR_NULL_PDU
对于
RESULT_ERROR_GENERIC_FAILURE,
the这个sentIntent可能包括额外的"errorCode",包含一些具体有用的信息帮助检查 。基于SMS控制的全部程序检查 sentIntent. 如果 sentIntent 为空,the caller will be checked against all unknown applications, which cause smaller number of SMS to be sent in checking period.如果不为null,当这个短信发送到接收者那里,这个PendtingIntent会被广播,状态报告生成的pdu(指对等层次之间传递的数据单位)会拓展到数据("pdu")
后两个参数的目的相信大家已经明确了,如果要用到就当然需要接收器了,(这里我写了一个根据第四个参数来进行相应动作的接收器)
在MainActivity中onCreate()写的代码
to = (EditText) findViewById(R.id.To);
msgInput = (EditText) findViewById(R.id.msg_input);
send = (Button) findViewById(R.id.send);
sendFilter = new IntentFilter();
sendFilter.addAction("SENT_SMS_ACTION");
sendStatusReceiver = new SendStatusReceiver();
registerReceiver(sendStatusReceiver,sendFilter);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SmsManager smsManager = SmsManager.getDefault();
Intent sentIntent = new Intent("SENT_SMS_ACTION");
PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this,0,sentIntent,0);
smsManager.sendTextMessage(to.getText().toString(), null, msgInput.getText().toString(), pi, null);
}
});
msgInput = (EditText) findViewById(R.id.msg_input);
send = (Button) findViewById(R.id.send);
sendFilter = new IntentFilter();
sendFilter.addAction("SENT_SMS_ACTION");
sendStatusReceiver = new SendStatusReceiver();
registerReceiver(sendStatusReceiver,sendFilter);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SmsManager smsManager = SmsManager.getDefault();
Intent sentIntent = new Intent("SENT_SMS_ACTION");
PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this,0,sentIntent,0);
smsManager.sendTextMessage(to.getText().toString(), null, msgInput.getText().toString(), pi, null);
}
});
收到广播相应的动作如下
public class SendStatusReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if (getResultCode() == RESULT_OK){
Toast.makeText(context,"Send succeeded",Toast.LENGTH_LONG).show();
}else {
Toast.makeText(context,"Send failed",Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onReceive(Context context, Intent intent) {
if (getResultCode() == RESULT_OK){
Toast.makeText(context,"Send succeeded",Toast.LENGTH_LONG).show();
}else {
Toast.makeText(context,"Send failed",Toast.LENGTH_LONG).show();
}
}
}
这样就完成了。很简单对不对。
别忘了权限
<uses-permission android:name="android.permission.SEND_SMS" />
0 0
- android学习笔记——收发短信练习
- Android多媒体应用——短信收发
- android收发短信
- Android收发短信
- Android短信收发
- Android收发短信
- Android收发短信
- Android短信收发
- android学习笔记短信
- 扣丁学堂——收发短信
- Android学习笔记(2)——短信发送器
- Android 应用中收发短信
- Android 接收和收发短信
- Android中短信的收发
- Android 收发短信 (8.2)
- AT指令实验——学习如何拨上网上/收发短信/拨打电话
- android学习笔记-拦截短信
- android学习笔记-拦截短信
- 安卓移动浏览器开源项目优分享浏览器的介绍
- ArcGIS Engine 开发中一些常用的语句
- STM32:keil的软件逻辑分析仪( logic analyzer)使用
- System.Web.Optimization找不到引用
- C/C++基础知识(一)数组和指针
- android学习笔记——收发短信练习
- EditText输入为空按钮不可点击搜索
- Web存储——sessionStorage与localStorage
- STM32:如何用JLINK ULINK JTAG 查看 KEIL /MDK 某条指令执行时间
- android学习笔记——android多线程编程初探
- The 5th Zhejiang Provincial Collegiate Programming Contest
- Unity+XiaoMiPush 对接小米推送sdk
- Bluemix结合DevOps Service实现一键部署
- android学习笔记——AsyncTask异步消息处理机制简单介绍及使用