Android中内容观察者的使用(读取短信内容)

上次我们说了内容观察者的使用,细心的朋友会发现,我们需要主动进行查询才可以知道数据库是否有了变化。如果我们想在数据库变化的第一时间就知道怎么办?这里我们以读取短信数据为例,说明内容观察者的使用方法。

首先我们需要加入一个权限

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

有了这个权限我们才可以获取短信的内容

接着我们要在需要读取短息的界面加入观察的代码,示例代码如下

public class GcdxnrActivity extends WaterPermissionActivity<GcdxnrModel> implements GcdxnrCallback {

    private Handler mHandler = new Handler();//声明一个处理器对象
    private SmsGerObserver mObserver;//声明一个短信获取的观察器对象
    private static Uri mSmsUri;//声明一个系统短信提供器的Uri对象
    private static String[] mSmsColumn;//声明一个短信记录的字段数组
    private TextView tv_chect_flow;

    @Override
    protected GcdxnrModel getModelImp() {
        return new GcdxnrModel(this,this);
    }

    @Override
    protected int getContentLayoutId() {
        return R.layout.activity_gcdxnr;
    }

    @Override
    protected void initWidget() {
        tv_chect_flow = findViewById(R.id.tv_chect_flow);
        requestPermission(READ_SMS);
    }

    @Override
    protected void doSMS() {
        initSmsObserver();
    }

    /**
     * 初始化短信观察器
     */
    private void initSmsObserver(){
        mSmsUri = Uri.parse("content://sms");
        mSmsColumn = new String[]{"address","body","date"};
        //创建一个短信观察器对象
        mObserver = new SmsGerObserver(this,mHandler);
        //给指定Uri注册内容观察器,一旦Uri内部发生数据变化,就出发观察器的onChange方法
        getContentResolver().registerContentObserver(mSmsUri,true,mObserver);
    }

    /**
     * 在页面销毁时触发
     */
    @Override
    protected void onDestroy() {
        //注销内容观察器
        getContentResolver().unregisterContentObserver(mObserver);
        super.onDestroy();
    }

    /**
     * 定义一个短信获取的观察器
     */
    private static class SmsGerObserver extends ContentObserver {

        private Activity mActivity;//声明一个上下文对象
        private GcdxnrActivity mainActivity;

        public SmsGerObserver(Activity activity, Handler handler){
            super(handler);
            mActivity = activity;
            mainActivity = (GcdxnrActivity) activity;
        }

        public void onChange(boolean selfChange){
            String sender = "";
            String content = "";
            //构建一个查询短信的条件语句,这里使用移动号码测试,故而查找10086发来的短信
            String selection = String.format("address='1008611' and date>%d",System.currentTimeMillis() - 1000*60);
            //通过内容解析器获取符合条件的结果集游标
            Cursor cursor = mActivity.getContentResolver().query(mSmsUri,mSmsColumn,selection,null,"date desc");
            //循环取出游标所指向的所有短信记录
            while (cursor.moveToNext()){
                sender = cursor.getString(0);
                content = cursor.getString(1);
                break;
            }
            cursor.close();//关闭数据库游标
            mainActivity.setText("发送者:"+sender+"\n"+"内容:"+content);
            super.onChange(selfChange);
        }
    }

    public void setText(String text){
        if (tv_chect_flow!=null) {
            tv_chect_flow.setText(text);
        }
    }
}

首先我们可以看到

requestPermission(READ_SMS);

这里是请求了一个Manifest.permission.READ_SMS动态权限,doSMS()是用户同意权限后执行的方法。我们在这里执行了initSmsObserver()方法,即初始化观察器的方法。大家可以使用自己的动态权限请求的方法。

如果数据库发生了改变,则会调用onChange方法。sender是短信发送者,content是短信的内容。

String selection = String.format("address='1008611' and date>%d",System.currentTimeMillis() - 1000*60);

这个代码中指定了要查询的短信是哪个号码发送的,以及要查询多久以前的短信。

大家有什么疑问都可以在评论区给我留言。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,关于android studio内容观察者读取数据库信息,我可以为您提供一些基本的知识点和示例代码。 首先,内容观察者是一种机制,用于在URI数据发生变化时通知应用程序。其执行的核心原理是,内容提供程序对外公开所管理的URI数据,当通过这个URI对数据进行了更改时,内容观察者会被触发,从而执行相应的回调函数。 在Android开发,我们可以借助内容提供程序来管理应用程序的数据,其包括了 SQLite 数据库。常用的内容观察者有 CursorLoader 和 ContentObserver 两种类型。 以下是一个简单的示例代码,演示了如何通过 CursorLoader 加载数据库的信息: ``` public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> { private static final int LOADER_ID = 1; private ListView listView; private SimpleCursorAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = findViewById(R.id.listView); String[] fromColumns = {"name", "age"}; int[] toViews = {R.id.name, R.id.age}; adapter = new SimpleCursorAdapter(this, R.layout.item_layout, null, fromColumns, toViews, 0); listView.setAdapter(adapter); getSupportLoaderManager().initLoader(LOADER_ID, null, this); } @NonNull @Override public Loader<Cursor> onCreateLoader(int id, @Nullable Bundle args) { Uri uri = MyContentProvider.CONTENT_URI; String[] projection = {"id", "name", "age"}; String selection = null; String[] selectionArgs = null; String sortOrder = null; return new CursorLoader(this, uri, projection, selection, selectionArgs, sortOrder); } @Override public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor data) { adapter.swapCursor(data); } @Override public void onLoaderReset(@NonNull Loader<Cursor> loader) { adapter.swapCursor(null); } } ``` 在这个示例代码,我们首先通过 SimpleCursorAdapter 将数据绑定到 ListView 上,然后使用 LoaderManager 来创建并初始化一个 CursorLoader 来加载数据库的数据,当数据库的信息发生变化时,内容观察者会被触发并调用相应的回调函数从而更新 UI。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值