第七例:短信监控之内容观察者

本文详细介绍了如何在Android中使用内容观察者来实现在Activity生命周期中监听短信,特别是在创建时注册,销毁时取消注册。同时,提到了需要获取的相关权限,并提供了链接深入探讨Telephony.Sms相关知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package demo.my.com.myapidemo.content;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.text.Editable;
import android.util.Log;
import android.widget.EditText;

import demo.my.com.myapidemo.R;

/**
 * Created by Hack on 2015/10/22.
 */
public class SmsContentObserver extends Activity {
    private static final String TAG = "apidemo";
    private EditText editText;
    ContentObserver smsObserver;
    private Uri SMS_INBOX = Uri.parse("content://sms");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        smsObserver = new SmsObserver(this, smsHandler);
        getContentResolver().registerContentObserver(SMS_INBOX, true,
                smsObserver);
        editText = (EditText) findViewById(R.id.edit_text);
    }

    public Handler smsHandler = new Handler() {
        //这里可以进行回调的操作
        //TODO

    };

    class SmsObserver extends ContentObserver {

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

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

    //获取手机短信内容
    public void getSmsFromPhone() {
        ContentResolver cr = getContentResolver();
        String[] projection = new String[]{"body","type"};//"_id", "address", "person",, "date", "type"
        String where = " date >  " + (System.currentTimeMillis() - 10 * 1000);
        Cursor cur = cr.query(SMS_INBOX, projection, where, null, "date desc");
        if (null == cur)
            return;
        if (cur.moveToNext()) {
            String body = cur.getString(cur.getColumnIndex("body"));
            String sms_type = cur.getString(cur.getColumnIndex("type"));
            if (body.indexOf("安卓") != -1 && sms_type.equals("1")) { //内容判断
                String res = body.substring(0, 4);
                Log.i(TAG, res);
                editText.setText(res);
                //将光标移动到字符串最后
                Editable ea = editText.getText();
                editText.setSelection(ea.length());

            }
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //这个时候就取消这个内容观察者,
        getContentResolver().unregisterContentObserver(smsObserver);
        Log.i(TAG, "onDestroy");
    }
}

在Activity创建的时候,注册内容观察者,在销毁的时候,取消内容观察者。

应用所需要的权限:

<uses-permission android:name="android.permission.READ_SMS" />
截图:

监听验证码

Telephony.Sms相关知识链接:

http://www.cnblogs.com/fengzhblog/p/3193973.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值