Android学习--多媒体功能:接收和发送短信
2017-06-29 14:22
477 查看
效果图:
拨打1008611后会有短信过来
几秒钟后,Toast出消息,短信送达,对方已接收
同一时间,这边用于测试的手机收到短信
代码如下:
MainActivity.java
package com.example.smstest; 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.SmsManager; import android.telephony.SmsMessage; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener { private TextView sender; private TextView content; private EditText to;// 接收人号码 private EditText msgInput;// 短信内容 private Button send;// 发送按钮 private IntentFilter receiveFilter, sendFilter, deliveryFilter;// 过滤器 private MessageReceiver messageReceiver;// 短信接收广播接收器,下面自定义这个广播 private SendStatusReceiver sendstatusReceiver;// 发送状态广播接收器,下面自定义这个广播 private DeliveryReceiver deliveryReceiver;// 短信送达状态广播,下面定义这个广播 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); receiveFilter = new IntentFilter(); receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); receive 4000 Filter.setPriority(100);// 设置优先级,不设置则接收不到,我也不知道为什么 messageReceiver = new MessageReceiver(); registerReceiver(messageReceiver, receiveFilter);// 注册短信接收广播 sendFilter = new IntentFilter(); sendFilter.addAction("SENT_SMS_ACTION"); sendstatusReceiver = new SendStatusReceiver(); registerReceiver(sendstatusReceiver, sendFilter);// 注册发送状态广播 deliveryFilter = new IntentFilter(); deliveryFilter.addAction("SENT_SMS_ACTION"); deliveryReceiver = new DeliveryReceiver(); registerReceiver(deliveryReceiver, deliveryFilter);// 注册送达状态广播 sender = (TextView) findViewById(R.id.sender); content = (TextView) findViewById(R.id.content); to = (EditText) findViewById(R.id.to); msgInput = (EditText) findViewById(R.id.msg_input); send = (Button) findViewById(R.id.send); send.setOnClickListener(this);// 按钮事件在最下方写出,这里设置监听 } class MessageReceiver extends BroadcastReceiver {// 定义短信接收广播 /* * 首先从Intent参数中取出一个Bundle对象,然后使用pdu密钥来提取一个SMS pdus数组,其中 * 每一个pdu都表示一条短信消息。接着使用SmsMessage的createFromPdu()方法将每一个 * pdu字节数组转换为SmsMessage对象,调用这个对象的getOriginatingAddress()方法 * 就可以获取到发送短信的发送方号码,调用getMessageBody()方法就可以获取到短信的内容,然后 * 将获取到的发送方号码和短信内容显示在TextView上。 */ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub\ Bundle bundle = intent.getExtras(); Object[] pdus = (Object[]) bundle.get("pdus");// 提取短信消息 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) { if (message != null) {// 1008611来的短信前面会留白,使头几个字节为空,所以在此做一个判断,空格不是空字节。 fullMessage += message.getMessageBody();// 获取短信内容 } } // 如果号码前面带有+86,那么字符串从第四个开始取,即删除“+86” if (address.contains("+86")) { address = address.substring(3); } sender.setText(address); content.setText(fullMessage); // Toast.makeText(context,"接收到了短信", // Toast.LENGTH_SHORT).show();//定义优先级之前用于检测广播是否接收 this.abortBroadcast(); // 部分手机比如小米手机略屌,有个变态设定防止应用更改系统通知, // 要修改进入小米短信应用,按菜单键,选择设置选项,拉倒最下面一行的高级设置选中打开,有个系统短信优先开关,把这个关闭,就能使用abortBroadcast方法拦截短信了。 } } } class SendStatusReceiver extends BroadcastReceiver {// 定义短信发送状态广播 @Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub if (getResultCode() == RESULT_OK) { // 短信发送成功 Toast.makeText(getBaseContext(), "send succeeded", Toast.LENGTH_SHORT).show(); } else { // 发送失败 Toast.makeText(getBaseContext(), "send failed", Toast.LENGTH_SHORT).show(); } } } class DeliveryReceiver extends BroadcastReceiver {// 定义短信送达状态广播 @Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub Toast.makeText(getBaseContext(), to.getText().toString() + "已接收短信", Toast.LENGTH_SHORT).show(); } } @Override protected void onDestroy() {// 解绑广播 super.onDestroy(); unregisterReceiver(messageReceiver); unregisterReceiver(sendstatusReceiver); unregisterReceiver(deliveryReceiver); } @SuppressWarnings("deprecation") @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.send: String name = to.getText().toString();// 要发送的人 String content = msgInput.getText().toString();// 短信内容 if (name.equals("") || content.equals("")) { // Toast.makeText(getBaseContext(),"短信内容不可为空",Toast.LENGTH_SHORT).show(); } else { @SuppressWarnings("deprecation") SmsManager smsManager = SmsManager.getDefault(); Intent sentIntent = new Intent("SENT_SMS_ACTION"); PendingIntent spi = PendingIntent.getBroadcast( MainActivity.this, 0, sentIntent, 0); Intent deliveryIntent = new Intent("DELIVERY_SMS_ACTION"); PendingIntent dpi = PendingIntent.getBroadcast( MainActivity.this, 0, deliveryIntent, 0); smsManager.sendTextMessage(name, null, content, spi, dpi); msgInput.setText("");// 发送后清空短信内容框 /* * public void sendTextMessage(String destinationAddress, String * scAddress, String text,PendingIntent sentIntent, * PendingIntent deliveryIntent) * destinationAddress:目的地,也就是对方的手机号 scAddress: * 服务中心地址,为空的话就是默认的SMSC text: 发送消息的具体内容 * sentIntent:当消息成功或者失败发送时,就发起这个广播 deliveryIntent: * 当消息到达目的地时,就发起这个广播 */} } } }
布局,activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:padding="10dp" android:text="From:" /> <TextView android:id="@+id/sender" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="200dp" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="top" android:padding="10dp" android:text="Content:" /> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> </ScrollView> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:padding="10dp" android:text="To:"/> <EditText android:id="@+id/to" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" > <EditText android:id="@+id/msg_input" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1"/> <Button android:id="@+id/send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="send"/> </LinearLayout> </LinearLayout>
在AndroidManifest.xml中配置两条权限
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.smstest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <!--增加接收短信权限 --> <uses-permission android:name="android.permission.RECEIVE_SMS" > </uses-permission> <!--增加发送短信权限 --> <uses-permission android:name="android.permission.SEND_SMS" > </uses-permission> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.smstest.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
相关文章推荐
- Android学习之1:实现发送短信功能
- Android 学习第13课,android 实现发送短信的功能
- android发送与接收超长短信
- Android多媒体学习:实现仿百度图片查看功能
- android接收短信功能
- Android学习 - android中发送短信的方法
- 举例说明android如何实现发送短信的功能
- android接收和发送短信
- 【Android学习日记】(七) 监听短信接收实例
- Android SmsManager 发送超长短信 接收不完整
- android中Mms学习笔记——短信(sms)接收流程(三)
- Android中发送和接收短信
- Android多媒体学习十一:实现仿百度图片查看功能
- android 短信的接收和发送处理
- 调用android平台功能-拨号,地图,网页,短信,Email,播放多媒体
- android实现发送短信并保存到数据库,同时可以获得发送报告和接收报告
- android短信系列之实现发送短信,并获得发送报告与接收报告
- android实现发送短信的功能
- 举例说明android中SmsManager的用法---用来实现手机发送短信的功能
- Android中发送和接收短信