8.2接收和发送条短信
来源:互联网 发布:mac ppt使用教程 编辑:程序博客网 时间:2024/05/22 00:05
8.2.1接收短信
当手机接收到一条短信的时候,系统会发出一值为android.provider.Telephony.SMS_RECEIVED
的广播,这条广播里携带者与短信相关的所有数据。每个程序都可以在广播接收器里对他进行监听,收到广播时再从中解析出短信的内容即可。
举例说明:
新建
SMStest
项目,首先修改activity_main.xml
中的代码.
在这个布局文件里,根元素下放置了两个LinearLayout
,用于显示两个行数据。第一个LinearLayout
中有两个TextView
,用于显示短信的发送方。第二个Linear Layout
中也有两个TextView
,用于显示短信的内容。修改
MainActivity
中的代码,在onCreate()
方法中获取两个TextView
的实例。创建广播接收器
创建一个广播接收器来接收系统发出的广播。在MainActivity
中新建MessageReceiver
内部类继承自BroadcastReceiver
,并在onReceive()
方法中编写获取短信数据的逻辑。
class MessageReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); Object[] pdus = (Object[]) bundle.get("pdus"); //提取短信消息 String format = intent.getStringExtra("format"); SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < messages.length; i++) { byte[] sms = (byte[])pdus[i]; messages[i] = SmsMessage.createFromPdu(sms, format); } String address = messages[0].getOriginatingAddress(); //获取发送方号码 String fullMessage = ""; for (SmsMessage message : messages) { fullMessage += message.getMessageBody(); //获取短信内容 } sender.setText(address); content.setText(fullMessage); } }
以上代码,首先从Intent
参数中取出了一个Bundle
对象,然后使用pdu
密钥来提取一个SMS pdus
数组,其中每一个pdu
都表示一条短信消息。接着使用SmsMessage
的createFromPdu()
方法将每一个pdu
字节数组转换为SmsMessage
对象,调用这个对象的getOriginatingAdress()
方法就可以获取到发送方的号码,调用getMessageBody()
方法就可以获取到短信的内容,然后将每一个SmsMessage
对象中的内容拼接起来,就组成了一条完整的短信。最后将将获取到的发送方号码和短信内容在TextView
中显示出来。
完成了MessageReceiver
之后,还需要对他进行注册才能接收短信广播。这里使用动态注册广播的技术。即首先在onCreate()
方法中对MessageReceiver
进行注册,然后在onDestroy()
方法中再对其取消注册。
最后在AndroidManifest.xml
中给程序声明一个接收短信的权限:
<uses-permission android:name = "android.permission.RECEIVE_SMS" />
8.2.2发送短信
在原项目的基础上,新增两个
LinearLayout
,分别处于第三、四行的位置。第三行放置了一个EditText
,用于输入接收方的号码。第四行设置了一个EditText
和一个Button
分别用于输入短信内容和发送短信。然后修改
MainActivity
中的代码,加入发送短信的处理逻辑:
...... private EditText to; private EditText msgInput; private Button send; ...... to = (EditText) findViewById(R.id.to); msgInput = (EditText) findViewById(R.id.msg_input); send = (Button) findViewById(R.id.send); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SmsManager smsManager = SmsManager.getDefault(); //利用SmsManager的getDefault()方法获取到SmsManager的实例 smsManager.sendTextMessage(to.getText().toString(), null, msgInput.getText().toString(), null); ......
以上代码,首先获取了布局文件中新增控件的实例,然后在send
按钮的点击事件里面处理了发送短信的具体逻辑。当send
按钮被点击时,会先调用SmsManager
的getDefault()
方法获取到SmsManager
的实例,然后再调用它的sendTextMessage()
方法就可以去发送短信了。sendTextMessage()
方法接受五个参数,第一个参数用于指定接收人的手机号码,第三个参数用于指定短信的内容,其他几个参数暂时用不到,这里直接传入null
;
3.最后,在AndroidManifest.xml
中声明权限:
<uses-permission android:name = "android.permission.SEND_SMS">
4.对短信的发送状态进行监控
利用setTextMessmage()
方法的第四个参数对短信的发送状态进行监控,修改MainActivity
中的代码:
public class MainActivity extends AppCompatActivity { **...... private IntentFilter sendFilter; private SendStatusReceiver sendStatusReceiver;** @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); **...... sendFilter = new IntentFilter(); sendFilter.addAction("SENT_SMS_ACTION"); sendStatusReceiver = new SendStatusReceiver(); registerReceiver(sendStatusReceiver, sendFilter);** send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SmsManager smsManager = SmsManager.getDefault(); //利用SmsManager的getDefault()方法获取到SmsManager的实例 **Intent sendIntent = new Intent("SEND_SMS_ACTION"); PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, sendIntent, 0); smsManager.sendTextMessage(to.getText().toString(), null, msgInput.getText().toString(), pi, null);** } }); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(messageReceiver); **unregisterReceiver(sendStatusReceiver);** } **...... class SendStatusReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (getResultCode() == RESULT_OK) { //短信发送成功 Toast.makeText(context, "发送成功", Toast.LENGTH_LONG).show(); } else { //短信发送失败 Toast.makeText(context, "发送失败", Toast.LENGTH_LONG).show(); } } }**}
可以看到,在Send
按钮的点击事件里调用了PendingIntent
的getBroadcast()
方法获取到了一个PendingIntent
对象,并将它作为第四个参数传到SendTextMessage()
方法中。然后又注册了一个新的广播接收器SendStatusReceiver
,这个广播接收器就是专门用于坚挺短信发送状态的,当getResultCode()
的值为RESULT_OK
就会提示发送成功,否则提示发送失败。
- 8.2接收和发送条短信
- 接收和发送短信
- 接收和发送短信
- 接收和发送短信
- android接收和发送短信
- Android 接收和发送短信
- Android接收和发送短信
- Android接收和发送短信
- Android接收短信和发送短信
- 第一行代码-8.2 接收和发送短信
- 通过RS232发送和接收短信
- Android中发送和接收短信
- android 短信的接收和发送处理
- android 短信的接收和发送处理
- Android 中发送和接收短信
- Android-短信的接收和发送
- Android中发送和接收短信
- android短信的接收和发送处理
- Android中web view截取H5的点击事件
- R语言学习笔记(6)(循环)
- 用二叉树、栈的知识实现一个简单计算器
- 欢迎使用CSDN-markdown编辑器
- Hadoop 的Writable序列化接口
- 8.2接收和发送条短信
- 冒泡排序
- 关于 sshd_config 配置文件 说明
- 通过 U 盘启动重装 macOS 系统
- 半知半解
- 一周极客热文:程序员给女朋友用HTML5制作的3D相册(附源码)
- Leetcode 122. Best Time to Buy and Sell Stock II 题解
- DAY21:leetcode #48 Rotate Image
- Docker 学习