android 操作短信数据库

最近在做一个短信接收器的小demo,当有未读短信时,如果查看了该短信,则将该条短信在数据库中的状态改为已读。

刚开始在自己的app中用如下方法尝试的:

public void updateSmsToRead() {
android.util.Log.d("zzh-debug", " updateSmsToRead id = " + mId);
ContentValues values = new ContentValues();
values.put("read", "1");
values.put("seen", "1");
try {
String[] arg = {this.mId};
int result;
android.util.Log.d("zzh-debug", " before update sms");
result = MClock.getAppContext().getContentResolver().update(Uri.parse("content://sms/inbox"), values, "_id=?", arg);
android.util.Log.d("zzh-debug", " result = " + result);
android.util.Log.d("zzh-debug", " after update sms");
} catch (Exception e) {
android.util.Log.d("zzh-debug", " update sms exception = " + e);
}
}

发现update不生效,但是query却是可以的,在网上查了很久后,发现有如下问题:

Other apps that are not selected as the default SMS app can only read the SMS Provider, but may also be notified when a new SMS arrives by listening for the SMS_RECEIVED_ACTION broadcast, which is a non-abortable broadcast that may be delivered to multiple apps. This broadcast is intended for apps that—while not selected as the default SMS app—need to read special incoming messages such as to perform phone number verification.

For more information about building SMS apps, read the blog post, Getting Your SMS Apps Ready for KitKat.

即只有默认短信应用才可以对短信数据库增删改,其他应用只能查询

如下是最后解决方案:

在我的应用中需要更新数据库的地方发送自定义广播给系统默认短信应用:

public void updateSmsToRead(String address, String body) {
Intent intent = new Intent("com.vanzotec.action.UPDATE_SMS");
intent.putExtra("sms_id", this.mId);
MClock.getAppContext().sendBroadcast(intent);
}

在系统短信中接收广播并更新数据库:

<receiver android:name=".util.MClockUpdateSmsReceiver">
<intent-filter>
<action android:name="com.vanzotec.action.UPDATE_SMS" />
</intent-filter>
</receiver>

package com.android.mms.util;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.ContentValues;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;

public class MClockUpdateSmsReceiver extends BroadcastReceiver {
private static final String TAG = "MClockUpdateSmsReceiver";

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("com.vanzotec.action.UPDATE_SMS")) {
String id = intent.getStringExtra("sms_id");
Log.d(TAG, " MClockUpdateSmsReceiver sms_id = " + id);
ContentValues values = new ContentValues();
values.put("read", "1");
values.put("seen", "1");
context.getContentResolver().update(Uri.parse("content://sms/inbox"), values, "_id=?", new String[]{id});
}
}

}

时间: 2024-08-02 18:55:12

android 操作短信数据库的相关文章

Android查询短信数据库

android常用数据库字段描述1.短信数据库String strUriInbox = "content://sms";Uri uriSms = Uri.parse(strUriInbox);Cursor c_groups = managedQuery( uriSms , new String[] { "date","person" }, select, null, "date DESC");strColumnName=_id

Android短信数据库监听回调多次问题

在监听Android短信数据库变化时.由于只能注册content://sms/ 的observer.所以,在数据库每次状态变化的时候,都会多次回调onChange 方式.目前还未找到很好的方式,解决回调多次的问题.只能通过代码逻辑来屏蔽这个问题. 目前,我使用的方式是通过时间来过滤两次的回调. long lastTimeofCall = 0L;    long lastTimeofUpdate = 0L;    long threshold_time = 10000; if (lastTimeo

Android黑科技,读取用户短信+修改系统短信数据库

安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题.这篇博客就秀一波“黑科技”. 读取用户短信 Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证码,一些app马上就能自动获取并填上验证码,省去我们手动填写验证码.原理就是通过Android的ContentProvider组件间接访问系统的短信数据库,获取所有短信内容.下面来演示一下. 布局很简单,如下: 代码如下: public class MainActivity extends Acti

Android之——短信的备份与还原

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47091281 目前,Android手机中的一些软件可以实现手机短信的备份与还原操作.这篇博文就是要向大家介绍如何实现Android短信的备份与还原操作.好了,相信大家对这些实用的功能还是比较感兴趣的,不多说了,我们直接进入主题吧. 一.原理 我的实现原理很简单,界面上放置几个TextView列表,其中两项为"短信的备份"和"短信的还原",点击&quo

Android读取短信和联系人

读取短信和联系人经常会用到,要了解的是这是内容提供者的知识点 先说短信,要从数据库中获取数据,就要了解其结构 短信数据库在data-->data中的下面路径 它的表结构如下,有3个是我们要注意的 Java代码为 //获取内容提供者 ContentResolver contentResolver = getContentResolver(); //获取短信表的路径 Uri uri = Uri.parse("content://sms"); //设置要查询的列名 String[] l

用Xposed框架拦截Android操作系统的短信接收

短信接收原理 关于Android操作系统短信的接收和发送流程的文章网上有一大堆,但是真正说得很清楚的不多,这篇blog写得不错.其实要想真正弄懂Android操作系统短信的流程,还是Linus的那句话: Read the fucking source code.呵呵 在Android操作系统中,大部分敏感信息的传递过程都是基于binder机制的,当然SMS也不例外.对于SMS的接收流程的描述从Framework层和Application层这两个层面进行介绍. Framework层 当短信到达Fr

Android版短信 筛选/批量删除 程序(支持Android 2.3~4.4)

这是一个短信筛选/批量删除的工具类程序. 首先上图: 1.展示全部系统短信. 2.新建筛选器(支持按号码筛选和按内容筛选) 3.筛选,批量删除. 主要代码: 1.获取系统全部短信 //获取系统全部短信 private List<SmsBean> getAllSms() { final String SMS_URI_ALL = "content://sms/"; Uri uri = Uri.parse(SMS_URI_ALL); String[] projection = n

Android获取短信验证码

Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安全性,开始使用通过服务器向用户发送验证码的方式,来保护用户个人信息的安全性.无论是用户注册时的信息验证还是当用户发出找回密码请求时的短信验证,他们的工作原理大致上是一致的,因为项目的需要研究了一下关于这方面的知识,本篇我将带领大家一起实现这一当下流行的设计方案. 众所周知,短信验证需要服务器端生成一个验证码,然后发送到用户输入的手机上,这个过程需要服务器主动向客户发送验证短信,所以这是就需要一个移动或联通的发送

android 定时短信app之时间选择器(一)

DatePicker类图 主要方法 public void init(int year, int monthOfYear, int dayOfMonth, DatePicker.OnDateChangedListener onDateChangedListener) 类 TimePicker类图 setOnTimeChangedListener public void setOnTimeChangedListener(TimePicker.OnTimeChangedListener onTime