接受由别的手机发送来的短信,并进行提示。
上面是最终效果图,当外部的手机发短信过来时,会弹出悬浮框进行信息内容展示。
代码结构图
main.xml
我们再main.xml中只存放一个TextView,让其展示等待接受短信的提示。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/TextView01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>
Activity的代码为
package cn.com.android.smsRceiver; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; /** * @author chenzheng_java * @since 2010/02/28 * @description 短信接收器 */ public class SmsReceiver extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView txt=(TextView)findViewById(R.id.TextView01); txt.setText("等待接收......"); } }
广播接收者BroadcastReceiverTest.java的代码如下
package cn.com.android.smsRceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsMessage; import android.widget.Toast; public class BroadcastReceiverTest extends BroadcastReceiver { /* 该字符串并不像我们前面的发短信程序中的action一样是自定义的,因为这里我们要接受的是由其他手机的系统 短信程序发送的短信,所以这里要用android.provider.Telephony.SMS_RECEIVED来匹配系统发送的Intent */ private final String Receive_Message = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onReceive(Context context, Intent intent) { // 获取该Intent的action名称 String intentActionName = intent.getAction(); if(Receive_Message.equals(intentActionName)){ StringBuilder stringBuilder = new StringBuilder(); /* *Bundle本质上是一个map,以键值对的形式存放着值。 *其内存放着通过putExtra()方法添加进去的数据,当然这个数据有可能是开发人员添加,也有可能是系统默认添加的。 *当没有任何数据的时候,返回null * */ Bundle bundle = intent.getExtras(); /* 系统默认的发短信程序会将信息内容通过putExtra方法放入bundle中,其map中的key为pdus,这个是写死的噢 *从下面的代码我们还可以看到,系统将数据以一个包含byte数组的数组的形式,放入了map中。 *类似putExtra("pdus",Object[] obj); 其中obj的元素为byte数组。 */ Object[] objects = (Object[]) bundle.get("pdus"); SmsMessage[]messages = new SmsMessage[objects.length]; for (int i = 0; i < objects.length; i++) { // createFromPdu创建一个SmsMessage对象 messages[i] = SmsMessage.createFromPdu((byte[]) objects[i]); } /* * 我们这里其实还有一个getOriginatingAddress方法可以用来获取信息内容。 * 它与getDisplayOriginatingAddress的区别在于前者只针对于短信,后者还可以处理油email得到的SmsMessge对象 * 与此类似,我们还有一个getDisplayMessageBody和getDisplayMessageBody方法,两者的区别和上面的一样。 * */ for(SmsMessage message:messages){ stringBuilder.append("接收到来自:/n"); // 获取信息来源地址 stringBuilder.append(message.getDisplayOriginatingAddress()); stringBuilder.append("/n-------传来的信息---------/n"); // 获取信息内容 stringBuilder.append(message.getDisplayMessageBody()); } Toast.makeText(context,stringBuilder.toString(), Toast.LENGTH_LONG).show(); /* 新建一个意图并发给系统以启动一个activity,在此我们通过i.addFlags()为其设置响应方式, *系统会创建一个新的task来存放SmsReceiver这个Activity,并且启动了它, *这就保证了SmsReceiver这个activity我们始终都能看到 */ Intent i = new Intent(context,SmsReceiver.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } } }
除了这些之外,我们还要在AndroidManifest.xml中注册receiver,并且为该程序添加短信接收权限。代码如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.com.android.smsRceiver" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".SmsReceiver" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 注册广播开始 --> <receiver android:name="BroadcastReceiverTest"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED"></action> </intent-filter> </receiver> <!-- 注册广播结束 --> </application> <!-- 为当程序添加接受短信的权限,添加了该权限之后,我们可以收到接收短信的广播 --> <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> </manifest>
废话连篇:
从整个代码的流程我们可以看到,代码中结构是这样的。
在xml配置文件中对类(这里是receiver)进行注册,注册了之后,当相应的事件(这里是收到短信)发生时,系统会自动的为我们触发事件。
这里需要注意点receiver标签的位置,它是与activity平级的。
代码很简答,我就不多说了。呵呵……