Android 接收短信

来源:互联网 发布:浙江软件考试成绩查询 编辑:程序博客网 时间:2024/05/20 04:09

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/

0 0
原创粉丝点击