Android 接收短信

原创 2016年08月31日 16:55:54

1.短信接收的思路

1.通过广播接收器接收短信广播进行解析,获取短信内容;

  1. 这种方式只对新收到的短消息有效,并不会读取收件箱中已读或未读的消息,只有当收到新来的短消息时,才会在广播接收器的onReceive中收到.
  2. 有一个问题是这个短信广播是系统的广播,而且是有序广播;存在被别的应用截断的危险.
    当然我们可以通过设置高优先级priority,让我们的应用优先收,但是其实有时是不管用的,现在在一些定制的系统或是有安全软件的情况下,往往短消息都被截取到,并被干掉。
public class SmsReceiver extends BroadcastReceiver {
    public static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals(ACTION)) {

            SmsMessage[] smsMessages = getMessageFromIntent(intent);
            StringBuilder stringBuilder = new StringBuilder();
            if (smsMessages != null && smsMessages.length > 0) {
                for (SmsMessage smsMessage : smsMessages) {
                    stringBuilder.append("接收到了短信:\n发件人是:");
                    stringBuilder.append(smsMessage.getDisplayOriginatingAddress());
                    stringBuilder.append("\n------短信内容-------\n");
                    stringBuilder.append(smsMessage.getDisplayMessageBody());
                    stringBuilder.append("\n------getMessageBody-------\n");
                    stringBuilder.append(smsMessage.getMessageBody());


                }
            }
            LogUtils.i(stringBuilder.toString());
            Toast.makeText(context, stringBuilder.toString(), Toast.LENGTH_LONG).show();
        }

    }

    public static SmsMessage[] getMessageFromIntent(Intent intent) {
        SmsMessage retmeMessage[] = null;
        Bundle bundle = intent.getExtras();
        Object pdus[] = (Object[]) bundle.get("pdus");
        retmeMessage = new SmsMessage[pdus.length];
        for (int i = 0; i < pdus.length; i++) {
            byte[] bytedata = (byte[]) pdus[i];
            retmeMessage[i] = SmsMessage.createFromPdu(bytedata);

        }
        return retmeMessage;
    }
}

解析短信消息的方法还有api给定的有如下,但是这个必须是得sdk 19以上才行。
SmsMessage[] smsMessages = Telephony.Sms.Intents.getMessagesFromIntent(intent);

2.通过读取短信数据库,获取短信内容;

  1. 这种方式可以获取手机上所有的短信,包括已读未读的短信.
  2. 有一个问题,如果来了新的短消息呢?我们总不能写个线程,每隔多少秒,去读取一下短信数据库吧? 解决办法就是通过短信观察器监听短信变化.

示例代码:

public class SmsActivity extends BaseActivity {

    private Uri SMS_INBOX = Uri.parse("content://sms/");
    private TextView mSmstext;
    private Button mSmstextButton;

    private SmsObserver smsObserver;

    class SmsObserver extends ContentObserver {
        public SmsObserver(Context context, Handler handler) {
            super(handler);
        }

        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            getSmsFromPhone();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sms);
        smsObserver = new SmsObserver(this, smsHandler);
        getContentResolver().registerContentObserver(SMS_INBOX, true, smsObserver);
        mSmstext = (TextView) findViewById(R.id.smstext);
        mSmstextButton = (Button) findViewById(R.id.getSmstxtButton);
        mSmstextButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                getSmsFromPhone();
            }
        });
    }
    Handler smsHandler =new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            return false;
        }
    });

    public void getSmsFromPhone() {
        ContentResolver cr = getContentResolver();
        String[] projection = new String[]{"_id", "address", "person", "body", "date", "type"};//"_id", "address", "person",, "date", "type
        String where = " address = '18602388575' ";//AND date >  "
//                + (System.currentTimeMillis() - 10 * 60 * 1000);
        Cursor cur = cr.query(SMS_INBOX, projection, "", 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"));


            mSmstext.setText("number:" + number + "name:" + name + "body:" + body);

        }
    }
}

3.使用注意

1.权限

2.

4.参考链接

http://blog.csdn.net/mad1989/article/details/22426415/

android短信发送和接受

短信发送发短信第一件事是在manifest文件中添加权限 第一方法:调用系统发短信的应用 /** * 调起系统功能发短信 * @param phoneNu...
  • JQ_AK47
  • JQ_AK47
  • 2016年09月19日 13:42
  • 1426

android短信接收处理和发送

关于短信接收处理方面,当前已经有一些app做的比较好了,比如发给手机发验证码验证的问题,很多app在手机接收到验证码后,不需要输入,就直接可以跳过验证界面,这就是用到了对接收到的短信的处理。至于短信的...
  • Double2hao
  • Double2hao
  • 2015年10月26日 19:03
  • 1242

Android5.0框架层短信接收过程分析

本文分析使用的是android5.0的源代码,涉及的相关文件: frameworks\opt\telephony\src\java\com\android\internal\telephony\RIL...
  • zero9988
  • zero9988
  • 2017年04月20日 15:15
  • 1957

Android5.0框架层短信接收过程分析

本文分析使用的是android5.0的源代码,涉及的相关文件: frameworks\opt\telephony\src\java\com\android\internal\telephony\RIL...
  • zero9988
  • zero9988
  • 2017年04月20日 15:15
  • 1957

android短信发送和接受

短信发送发短信第一件事是在manifest文件中添加权限 第一方法:调用系统发短信的应用 /** * 调起系统功能发短信 * @param phoneNu...
  • JQ_AK47
  • JQ_AK47
  • 2016年09月19日 13:42
  • 1426

android学习十四(android的接收短信)

android中短信的发送也接收拦截
  • wj903829182
  • wj903829182
  • 2014年11月18日 10:53
  • 2261

Android短信Mms接受流程

短信的接收流程应用层 1、源文件 这部分代码在packages/apps/Mms下,涉及的主要类: [plain] view plain copy com.android....
  • wds1181977
  • wds1181977
  • 2016年07月07日 16:56
  • 1389

Android短信接收过程源码分析(原)

本文主要讨论RILJ接收到一条普通短消息时是如何把它转换成Broadcast发送到系统中的。 一、GsmSMSDispatcher注册监听过程         在《Framework层中的...
  • u010961631
  • u010961631
  • 2013年10月14日 10:53
  • 5103

Android实战技巧之三十九:短信收发

7月4日从广州出差回来就定下写作计划,但迟迟没有动笔。耽搁的原因还是老样子,工作上又有新任务,全部精力都投入过去了,每天精疲力竭的回来也打不起精神做其他事了。这就是精力管理不当所致,就像我把很多要做的...
  • lincyang
  • lincyang
  • 2015年08月15日 21:57
  • 9713

android接收和发送短信代码-BroadcastReceiver应用

学习郭神的第一行代码的时候跟着敲的,留作今后学习用。
  • u011758031
  • u011758031
  • 2015年09月27日 01:33
  • 473
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 接收短信
举报原因:
原因补充:

(最多只允许输入30个字)