短信接收
android中当手机接收到一条短信后,会发送android.provider.Telephony.SMS_RECEIVED 的广播,这条广播中携带有与短信相关的所有数据。每个应用程序都可以在广播接收器里对他监听。
简单的短信接收程序:
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); //设置过滤器 intentFilter = new IntentFilter(); intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); //获取MessageReceiver实例 messageReceiver = new MessageReceiver(); //注册广播 registerReceiver(messageReceiver,intentFilter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(messageReceiver); } //接收短信广播接收器 class MessageReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //使用 pdu 密钥来提取一个 SMS pdus 数组 ,其中每一个 pdu 都表示一条短信消息 Object[] smsPdus = (Object[]) intent.getExtras().get("pdus"); //用来储存消息 SmsMessage[] smsMessage = new SmsMessage[smsPdus.length]; /** * SmsMessage.createFromPdu((byte[]) smsPdus[i], format); * 第二个参数应该是短信的类型, GSM与CDMA短信的解码方式不同,所以应该传入这个参数 * */ String format = intent.getStringExtra("format"); //将每一个 pdu 格式数组转换为 SmsMessage 对象 for(int i = 0; i < smsMessage.length; i++){ if(Build.VERSION.SDK_INT < 23) { smsMessage[i] = SmsMessage.createFromPdu((byte[]) smsPdus[i]); } else { smsMessage[i] = SmsMessage.createFromPdu((byte[]) smsPdus[i], format); } } //获取发送的号码 String address = smsMessage[0].getOriginatingAddress(); //将多段内容链接起来 StringBuilder messageContent = new StringBuilder(); for(SmsMessage message : smsMessage){ messageContent.append(message.getMessageBody()); } //设置视图内容 sender.setText(address); content.setText(messageContent.toString()); } }
在AndroidManifest.xml中添加
<uses-permission android:name="android.permission.RECEIVE_SMS" />
由于收到短信系统会发送一条广播,那我们应该去监听这条广播,获取短信内容。 所以先要新建一个广播接收器类 MessageReceiver 继承自 Broadcast 。重写onReceiver()方法。
主要步骤:
1.Intent.getExtras()方法获取一个Bundle对象,Bundle.get("pdus"); 获取短信内容; pdus是一个object类型的数组,每一个object都是一个byte[]字节数组,每一项为一条短信。
2.将字节数组封装成SmsMessage类型,在android API 23以后 SmsMessage.createFromPdu((byte[]) ); 不在推荐使用,替代的是 SmsMessage.createFromPdu((byte[]) , format); 第二个参数代表手机制式;可以使用 intent.getStringExtra("format"); 获得。
3.SmsMessage对象的getMessageBody()方法可以获得短信内容。getOriginatingAddress()可以获得发送方的号码。
所以一旦接收到短信,系统发送 android.provider.Telephony.SMS_RECEIVED 广播,就会被动态注册的接收器接收,然后就会调用MessageReceiver的onReceiver()方法。
短信截断
在android 4.4以后abortBroadcast()不能截断短信。
短信发送
SmsManager对象有发送短信功能,可以调用SmsManager.getDefault()方法获取。
SmsManager.sendTextMessage()方法有5个参数,第一个参数是目标号码,第三个参数是短信内容,第四个参数是一个PendingIntent对象。
PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this,0,Intent,0);该方法可以获取一个PendingIntent对象。
现在来看一个例子:
SmsManager smsManager = SmsManager.getDefault(); Intent sendIntent = new Intent(); sendIntent.setAction("SENT_SMS_ACTION"); PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this,0,sendIntent,0); //发送短信/* sendTextMessage方法有5个参数,第一个参数指指定接收人的号码,第三个指定内容 */ smsManager.sendTextMessage(to.getText().toString(),null,msgInput.getText().toString(),pi,null);
这里表示当发送短信时,我们自己写了一条广播,发出一条为 SENT_SMS_ACTION 的广播,由于在虚拟机上操作,我们可以来通过监听这个广播来观察短信发送是否成功。
到这里学习了基本的短信接收和发送功能。