Android学习(1)——接收和发送短信
2015-10-24 21:05
507 查看
Android手机都会内置一个短信应用程序,使用它就可以轻松地完成收发短信的操作。同时Android还提供了一系列的API,使得我们可以在自己的应用程序里接收和发送短信。
当手机接收到一条短信的时候,系统会发出一条值为android.provider.Telephony.SMS_RECEIVED的广播,这条广播里携带着与短信相关的所有数据。每个应用程序都可以在广播接收器里对它进行监听,收到广播时再从中解析出短信的内容即可。
举个例子吧,新建一个SMSTest项目,首先修改activity_main.xml中的代码,如下所示:
这里是MainActivity文件,注意点已经都写在了程序里面,自己看吧。。。
该有的权限还是要加上才行的:
当手机接收到一条短信的时候,系统会发出一条值为android.provider.Telephony.SMS_RECEIVED的广播,这条广播里携带着与短信相关的所有数据。每个应用程序都可以在广播接收器里对它进行监听,收到广播时再从中解析出短信的内容即可。
举个例子吧,新建一个SMSTest项目,首先修改activity_main.xml中的代码,如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 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="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 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>
这里是MainActivity文件,注意点已经都写在了程序里面,自己看吧。。。
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 { // 收到的发送方号码 private TextView sender; // 收到的短信内容 private TextView content; // 要发送的号码 private EditText to; // 要发送的内容 private EditText msgInput; // 点击发送 private Button send; // 注册MessageReceiver接收器 private IntentFilter receiveFilter; // MessageReceiver接收对象 private MessageReceiver messageReceiver; // 注册SendStatusReceiver接收器 private IntentFilter sendFilter; // SendStatusReceiver接收对象 private SendStatusReceiver sendStatusReceiver; @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); to = (EditText) findViewById(R.id.to); msgInput = (EditText) findViewById(R.id.msg_input); send = (Button) findViewById(R.id.send); /** * 动态注册广播技术,短信接收 * */ receiveFilter = new IntentFilter(); receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); // 这里设置优先级的目的是让它优先于系统短信程序接收到短信广播 receiveFilter.setPriority(100); messageReceiver = new MessageReceiver(); registerReceiver(messageReceiver, receiveFilter); /** * 动态注册广播技术,短信发送状态反馈 * */ sendFilter = new IntentFilter(); sendFilter.addAction("SENT_SMS_ACTION"); sendStatusReceiver = new SendStatusReceiver(); registerReceiver(sendStatusReceiver, sendFilter); send.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 获取SmsManager实例 SmsManager smsManager = SmsManager.getDefault(); // 这个里面传递的SENT_SMS_ACTION和上面动态注册时的一样,所以能够与那个广播联系在一起。 Intent sentIntent = new Intent("SENT_SMS_ACTION"); // 获取一个PendingIntent对象, PendingIntent pi = PendingIntent.getBroadcast( MainActivity.this, 0, sentIntent, 0); // 发送短信 // 第一个参数是目的号码,第三个参数是短信内容,第四个参数pi用来对短信的发送状态进行监控 smsManager.sendTextMessage(to.getText().toString(), null, msgInput.getText().toString(), pi, null); } }); } @Override protected void onDestroy() { super.onDestroy(); /** * 取消动态注册的广播接收器 * */ unregisterReceiver(messageReceiver); unregisterReceiver(sendStatusReceiver); } /** * 创建一个广播接收器来接收系统发出的短信广播 * */ class MessageReceiver extends BroadcastReceiver { /** * 编写获取短信数据的逻辑 * */ @Override public void onReceive(Context context, Intent intent) { // 首先从Intent参数中取出一个Bundle对象 Bundle bundle = intent.getExtras(); // 然后使用pdu密钥来提取一个SMS pdus数组,其中每一个pdu都表示一个字节数据(这里和原文有差异) Object[] pdus = (Object[]) bundle.get("pdus"); // 接着使用SmsMessage的createFromPdu()方法将每一个pdu字节数组转换为SmsMessage对象 SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < messages.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); } // 调用这个对象的getOriginatingAddress()方法就可以获取到短信的发送方号码 String address = messages[0].getOriginatingAddress(); // 调用getMessageBody()方法就可以获取到短信的内容,并将它们拼接起来,组成完整的短信内容。 String fullMessage = ""; for (SmsMessage message : messages) { fullMessage += message.getMessageBody(); } // 然后将发送方号码和短信内容显示在TextView上。 sender.setText(address); content.setText(fullMessage); // 终止掉广播的继续传递,但这个功能要慎用。 abortBroadcast(); } } /** * 用于监听短信发送状态 * */ 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(); } } } }
该有的权限还是要加上才行的:
<?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="14" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <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简易计算器
- Android(1):Android创世纪(2)Activity启动流程(3)为控件绑定监听器
- android的xUtils框架
- 中国企业为啥不喜欢投资未来?
- android的R.java
- android的ListView显示
- android 设置返回键监听
- android---(xml、json解析)
- WIFI项目--Android 获取本机IP(wifi下),子网掩码,网关,dns等信息
- android 控件不同状态 selector----drawable
- Android自定义View之TitleBar,通用标题栏
- Android Studio加入百度地图功能
- 【每日一点】android 震动
- android百度地图(二)之定位
- Android四大图片缓存框架之-Fresco之initialize(二)
- 深入理解Android之AOP
- 修改data权限
- android下数据库操作
- Android开发实例-健康食谱应用(一)
- Android开发环境配置