uniapp 短信读取及条件过滤
近期在开发一款短信获取应用,采用的Hbuilder+uniapp开发,安卓环境
查阅了很多资料,都是只给出了最简单的demo,怎么设置过滤条件鲜见提及,所以我把自己测试出来的结果拿来共享
上代码
let last_id = uni.getStorageSync('smsid')||0; //上次任务短信id最大值
var main = plus.android.runtimeMainActivity();
var Uri = plus.android.importClass('android.net.Uri'); var ContactsContract = plus.android.importClass('android.provider.ContactsContract'); var uri = Uri.parse('content://sms/inbox');//收件箱 var cr = main.getContentResolver(); plus.android.importClass(cr); var cur = cr.query( uri, //短信路径 ['_id','address','body', 'date'],//select ...,默认null
//本文关键:短信的条件过滤,这里过滤的日期和短信id,实测有效,注意变量必须是string类型,其它int类型报错
"date>? and _id>?",//where..,值可以用'?'代替,默认null [String(new Date('2022-09-01').getTime()),String(last_id)], //变量..,必须转成String,不然会报错,默认null '_id asc'//order by...,尝试过desc,但是得不到最新短信,不知道什么原因,所以asc稳妥 ); plus.android.importClass(cur); cur.moveToFirst(); cur.getValue = (o, field) => { return o.getString(o.getColumnIndex(field)); }; cur.moveToNext(); var max_id = 0; //本次任务短信id最大值 var rows = []; while (cur.moveToNext()) { var bson = {}; //电话,短信内容,接收日期, ['_id','address','body', 'date'].forEach(f => { bson[f] = cur.getValue(cur, f); }); console.log(bson._id,bson.body); max_id = max_id > bson._id ? max_id : bson._id; if(/[\[【].{2,20}银行/.test(bson.body)){
rows.push(bson); } } cur.close(); if (max_id != 0 && last_id != max_id) { uni.setStorageSync('smsid', max_id);//存新的短信id } return rows;