Android_短信
2016-06-14 17:59
603 查看
Android_短信
1、接受短信
当手机接收到一条短信的时候,系统会发出一条值为android.provider.Telephony.SMS_RECEIVED的广播,这条广播携带者与短信相关的所有数据。结合我们从前学习的BroadcastReceiver相关的知识,我们就可以将这个小实践写出来。1、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" tools:context=".MainActivity" > <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="50dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:padding="10dp" android:text="Content" /> <TextView android:id="@+id/content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> </LinearLayout> </LinearLayout>
2、在MainActivity中的主要逻辑代码:
public class MainActivity extends Activity { private TextView tvSender,tvContent; private IntentFilter filter; private MessageReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); filter=new IntentFilter(); filter.addAction("android.provider.Telephony.SMS_RECEIVED"); receiver=new MessageReceiver(); registerReceiver(receiver, filter); tvSender=(TextView) findViewById(R.id.sender); tvContent=(TextView) findViewById(R.id.content); } class MessageReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { 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) { //获取短信内容 fullMessage += message.getMessageBody(); } tvSender.setText(address); tvContent.setText(fullMessage); } } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); } }
3、不要忘了读取短信是需要权限的,我们要在AndroidManifest.xml文件中添加以下代码:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
拦截短信
当我们在我们自己的程序中接收到短信的时候,我们手机屏幕上的状态栏中还会有系统给的通知,这样给用户的体验会非常的查,我们不想把这个短信发给系统,所以我们要拦截短信。系统发出的短信广播是一条有序广播。1、在动态注册广播的同时,添加一行代码:
filter.setPriority(100);
2、在重写的onReceiver()方法中,当我们把我们的逻辑执行完以后,我们添加一行代码:
abortBroadcast();
这样,我们就可以防止系统的短信应用程序,接收到短信了。
发送短信
我还是在刚刚那个项目之上进行修改,我在activity_main.xml文件中又添加了2行布局。1、
<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>
2、我的MainActivity中的逻辑代码如下:
public class MainActivity extends Activity implements OnClickListener{ private TextView tvSender,tvContent; private IntentFilter filter,sendFilter; private MessageReceiver receiver; private SendStatusReceiver sendReceiver; private EditText etTo,etMsg; private Button btnSend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //动态注册接收短信的广播 filter=new IntentFilter(); filter.addAction("android.provider.Telephony.SMS_RECEIVED"); filter.setPriority(100); receiver=new MessageReceiver(); registerReceiver(receiver, filter); //动态注册发送短信的广播 sendFilter=new IntentFilter(); sendFilter.addAction("SENT_SMS_ACTION"); sendReceiver =new SendStatusReceiver(); registerReceiver(sendReceiver, sendFilter); //各个控件的实例化 tvSender=(TextView) findViewById(R.id.sender); tvContent=(TextView) findViewById(R.id.content); etTo=(EditText) findViewById(R.id.to); etMsg=(EditText) findViewById(R.id.msg_input); btnSend=(Button) findViewById(R.id.send); btnSend.setOnClickListener(this); } //发送短信按钮的点击事件 @Override public void onClick(View v) { switch (v.getId()) { case R.id.send: SmsManager manager =SmsManager.getDefault(); //这里使用PendingIntent的目的就是为了验证短信发送成功了。 Intent sendIntent=new Intent("SENT_SMS_ACTION"); PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this, 0, sendIntent, 0); manager.sendTextMessage(etTo.getText().toString(), null, etMsg.getText().toString(), pendingIntent, null); break; default: break; } } /** * 接收短信的内部类 * */ class MessageReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { 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) { //获取短信内容 fullMessage += message.getMessageBody(); } tvSender.setText(address); tvContent.setText(fullMessage); abortBroadcast(); } } /** * 发送短信的内部类 * */ class SendStatusReceiver extends BroadcastReceiver{ @Override public void onReceive(Context arg0, Intent arg1) { if (getResultCode()==RESULT_OK) { Toast.makeText(MainActivity.this, "Send succeeded", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(MainActivity.this, "Send failed", Toast.LENGTH_SHORT).show(); } } } @Override protected void onDestroy() { super.onDestroy(); //注销接收短信的receiver unregisterReceiver(receiver); //注销发送短信的receiver unregisterReceiver(sendReceiver); } }
3、最后,别让了发送短信也是需要权限的:
<uses-permission android:name="android.permission.SEND_SMS"/>
这里我们通过SmsManager的getDefault()方法获取到SmsManager的实例,然后调用sendTextMessage()方法发送短信。根据国际标准,每条短信的长度不得超过160个字符,如果想要发送超出这个长度的短信,则需要将这条短信分割成多条短信来发送。使用SmsManager的sendMultipartTextMessage()方法就可以实现上述的功能。
ArrayList<String> messages=manager.divideMessage(etMsg.getText().toString()); manager.sendMultipartTextMessage(etTo.getText().toString(), null, messages, null, null);
相关文章推荐
- Android-自定义多TAB悬浮控件实现蘑菇街首页效果
- Android应用崩溃后异常捕获并重启并写入日志
- Android常用Manager整理
- Android之点九图的制作及使用
- Android之Fragment(五):Fragment的通信问题
- Android 进程间通信实现原理分析
- Sharesdk 使用中遇到的问题 Android
- Android SQLite之乐学成语项目数据库存储
- Android上自定义View实现电子签名功能
- android studio 添加按钮点击事件的三种方法
- Android 照片选择器
- ANDROID 混淆
- Android BLE 中心和外设通信时 中心设备的onCharacteristicChanged() 没有回调
- (android)通过wifiManager获取关于wifi的ip,dns....
- android.os.Process.killProcess(android.os.Process.myPid())与Activity生命周期的影响
- android与h5
- Android:PopupMenu显示item中的android:icon
- 接口回调基本建立
- Android 常用数据适配器ArrayAdapter
- LayoutTransition 布局动画笔记