学习Android手机短信监控

来源:互联网 发布:js判断变量是否为对象 编辑:程序博客网 时间:2024/06/06 09:38

目的

最近有一个项目需要用Android手机去获取验证码来进行登陆,在stackoverflow和google找了很多例子来学习。需求涉及了两个部分,第一个部分是获取短信这个部分,也就是本文的部分,第二是将获取到的短信传输回到服务器上的部分,下一篇文章会讲到。

内容

获取短信一共分为三个步骤:
1. 通过 BroadCast extends BroadcastReceiver 来接收短信送达的广播。
2. 通过官方的content provider来获取短信所在的地址。
3. 通过 context.getContentResolver() 作为阅读工具(指针),来阅读短信。

这里附带上完整项目的地址,在github上:
https://github.com/soulomoon/android-SMS-Listening

1.BroadcastReceiver

每次手机收到一条短信都会通过向Android系统发送一条广播,说收到了一条短信。这里我们新建一个BroadcastReceiver的子类,然后通过重载onReceive这个方法来写收到广播后的动作。代码非常简单下:

import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class BroadCast extends BroadcastReceiver {    @Override    public void onReceive(final Context context, final Intent intent) {        Log.d("broadcast", "我操居然接收到广播了");    }}

但此广播没有注明是什么广播,怎么确定是要接受哪种广播呢,必须要进行注册这个BroadcastReceiver为短信通知的广播接收器。这样子在接收到短信后onReceive方法就会自动调用

        <receiver            android:name="com.example.soulomoon.hello.BroadCast">            <intent-filter>                <action android:name="android.provider.Telephony.SMS_RECEIVED" />            </intent-filter>        </receiver>

2.content provider和context.getContentResolver()

在安卓获取存储的信息需要通过content provider,短信也不例外。
需要利用一个指针,通过context.getContentResolver()获取。
地址由Telephony.Sms.Inbox.CONTENT_URI给出,
内容是Telephony.TextBasedSmsColumns.BODY,短信主题的内容。
成功创建了得到指向的内容后Cursor query后就可以利用这个指针来进行信息读取。

public static String getLatestMsg(final Context context) {        Log.i("getLatestMsg", "begin");             final List<String> lstSms = new ArrayList<>();        //创建指针        final ContentResolver cr = context.getContentResolver();        //指针指向短信内容        final Cursor query = cr.query(Telephony.Sms.Inbox.CONTENT_URI,                           new String[] {Telephony.TextBasedSmsColumns.BODY},                          null,                          null,                          Telephony.Sms.Inbox.DEFAULT_SORT_ORDER);         //检查指针内容是否为空        assert query != null;        //得到指针内容的行数        final int totalSMS = query.getCount();        //从第一列读取到最后一列        if (query.moveToFirst()) {            for (int i = 0; i < totalSMS; i++) {                lstSms.add(query.getString(0));                query.moveToNext();            }        } else {            lstSms.add("You have no SMS in Inbox");        }        //关闭通过内容的通道        query.close();        //返还最新的信息        return lstSms.get(0);    }
1 0
原创粉丝点击