android中可以通过两种方式发送短信
第一:调用系统短信接口直接发送短信;主要代码如下:
1. * 直接调用短信接口发短信
2. * @param phoneNumber
3. * @param message
4. */
5. public void sendSMS(String phoneNumber,String message){
6. //获取短信管理器android.telephony.SmsManager,不要导错包。
7. android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault();
8. //拆分短信内容(手机短信长度限制)。默认140个字符,模拟器不可以发送中文会乱码
9. List<String> divideContents = smsManager.divideMessage(message);
10. for (String text : divideContents) {
11. null, text, sentPI, deliverPI);
12. }
13. }
第二:调起系统发短信功能;主要代码如下:
1. * 调起系统发短信功能
2. * @param phoneNumber
3. * @param message
4. */
5. public void doSendSMSTo(String phoneNumber,String message){
6. if(PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber)){
7. new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+phoneNumber));
8. "sms_body", message);
9. startActivity(intent);
10. }
11. }
别忘了权限:
<uses-permission android:name="android.permission.SEND_SMS" />
这里主要讲解第一种方法,第一种方法可以监控发送状态和对方接收状态。
处理返回的发送状态:
1. //处理返回的发送状态
2. String SENT_SMS_ACTION = "SENT_SMS_ACTION";
3. Intent sentIntent = new Intent(SENT_SMS_ACTION);
4. PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, sentIntent,
5. 0);
6. // register the Broadcast Receivers
7. context.registerReceiver(new BroadcastReceiver() {
8. @Override
9. public void onReceive(Context _context, Intent _intent) {
10. switch (getResultCode()) {
11. case Activity.RESULT_OK:
12. Toast.makeText(context,
13. "短信发送成功", Toast.LENGTH_SHORT)
14. .show();
15. break;
16. case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
17. break;
18. case SmsManager.RESULT_ERROR_RADIO_OFF:
19. break;
20. case SmsManager.RESULT_ERROR_NULL_PDU:
21. break;
22. }
23. }
24. }, new IntentFilter(SENT_SMS_ACTION));
处理返回的接收状态 :
1. //处理返回的接收状态
2. String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";
3. // create the deilverIntent parameter
4. Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);
5. PendingIntent deliverPI = PendingIntent.getBroadcast(context, 0,
6. 0);
7. context.registerReceiver(new BroadcastReceiver() {
8. @Override
9. public void onReceive(Context _context, Intent _intent) {
10. Toast.makeText(context,
11. "收信人已经成功接收", Toast.LENGTH_SHORT)
12. .show();
13. }
14. }, new IntentFilter(DELIVERED_SMS_ACTION));
发送短信的参数说明:
1. smsManager.sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent)
-- destinationAddress:目标电话号码
-- scAddress:短信中心号码,测试可以不填
-- text: 短信内容
-- sentIntent:发送 -->中国移动 --> 中国移动发送失败 --> 返回发送成功或失败信号 --> 后续处理 即,这个意图包装了短信发送状态的信息
-- deliveryIntent: 发送 -->中国移动 --> 中国移动发送成功 --> 返回对方是否收到这个信息 --> 后续处理 即:这个意图包装了短信是否被对方收到的状态信息(供应商已经发送成功,但是对方没有收到)。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Android开发获取手机短信内容(监听器)
最近做的项目里要监听手机的短消息内容。
前提--权限:
1. <uses-permission android:name="android.permission.RECEIVE_SMS" >
2. </uses-permission>
3. <uses-permission android:name="android.permission.READ_SMS" >
4. </uses-permission>
方式一:通过广播监听短信消息
(注意:这种方式只对新收到的短消息有效,运行代码,并不会读取收件箱中已读或未读的消息,只有当收到新来的短消息时,才会执行onChange方法)
注册一个广播
1. <receiver android:name="com.dbjtech.acbxt.waiqin.SmsReciver" >
2. <intent-filter android:priority="999">
3. <action android:name="android.provider.Telephony.SMS_RECEIVED" />
4. </intent-filter>
5. </receiver>
SmsReceiver.Java
1. public class SmsReciver extends BroadcastReceiver {
2. @Override
3. public void onReceive(Context context, Intent intent) {
4. Bundle bundle = intent.getExtras();
5. null;
6. if (null != bundle) {
7. "pdus");
8. for (Object object : smsObj) {
9. byte[]) object);
10. new Date(msg.getTimestampMillis());//时间
11. new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
12. String receiveTime = format.format(date);
13. "number:" + msg.getOriginatingAddress()
14. " body:" + msg.getDisplayMessageBody() + " time:"
15. + msg.getTimestampMillis());
16.
17. //在这里写自己的逻辑
18. if (msg.getOriginatingAddress().equals("10086")) {
19. //TODO
20.
21. }
22.
23. }
24. }
25. }
26.
27. }
系统的这个广播是有序广播,就是当别的程序先获取到了这个广播再传递给你,当然它也可以干掉这个广播,让你接收不到,这样你的程序肯定是接收不到这个广播的了。我们发现,通过设置priority的数值,其实有时是不管用的,现在在一些定制的系统或是有安全软件的情况下,往往短消息都被截取到,并被干掉。
那么,我们只能使用方法二,监听短信数据库的变化,这种方式比方法一稍微复杂一些,不过使用起来也很方便,不受其它程序干扰~
方式二:通过短信数据库获取短信内容
(注意:这种方式可以获取手机上所有的短信,包括已读未读的短信,是不是很赞)
1. private Uri SMS_INBOX = Uri.parse("content://sms/");
2. public void getSmsFromPhone() {
3. ContentResolver cr = getContentResolver();
String[] projection = new String[] { "body" };//"_id", "address", "person",, "date", "type
String where = " address = '1066321332' AND date > "
+ (System.currentTimeMillis() - 10 * 60 * 1000);
Cursor cur = cr.query(SMS_INBOX, projection, where, null, "date desc");
if (null == cur)
return;
if (cur.moveToNext()) {
String number = cur.getString(cur.getColumnIndex("address"));//手机号
String name = cur.getString(cur.getColumnIndex("person"));//联系人姓名列表
String body = cur.getString(cur.getColumnIndex("body"));
//这里我是要获取自己短信服务号码中的验证码~~
Pattern pattern = Pattern.compile(" [a-zA-Z0-9]{10}");
Matcher matcher = pattern.matcher(body);
if (matcher.find()) {
String res = matcher.group().substring(1, 11);
mobileText.setText(res);
}
} 4. }
sms主要结构:
_id:短信序号,如100
thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的
address:发件人地址,即手机号,如+86138138000
person:发件人,如果发件人在通讯录中则为具体姓名,陌生人为null
date:日期,long型,如1346988516,可以对日期显示格式进行设置
protocol:协议0SMS_RPOTO短信,1MMS_PROTO彩信
read:是否阅读0未读,1已读
status:短信状态-1接收,0complete,64pending,128failed
type:短信类型1是接收到的,2是已发出
body:短信具体内容
service_center:短信服务中心号码编号,如+8613800755500
通过方式二,我们就能获取手机中所有的短消息了,可是还有一个问题,如果来了新的短消息呢?我们总不能写个线程,每隔多少秒,去读取一下短信数据库吧?其实我们可以把方式二换个方式写:(内容观察者的方式)
1. private SmsObserver smsObserver;
2.
3. protected void onCreate(Bundle savedInstanceState) {
4. super.onCreate(savedInstanceState);
5. setContentView(R.layout.app_login);
6. new SmsObserver(this, smsHandler);
7. true,
8. smsObserver);
9.
10. }
11. public Handler smsHandler = new Handler() {
12. //这里可以进行回调的操作
13. //TODO
14.
15. };
16. class SmsObserver extends ContentObserver {
17.
18. public SmsObserver(Context context, Handler handler) {
19. super(handler);
20. }
21.
22. @Override
23. public void onChange(boolean selfChange) {
24. super.onChange(selfChange);
25. //每当有新短信到来时,使用我们获取短消息的方法
26. getSmsFromPhone();
27. }
28. }