我正在使用内容观察员content://sms.我正在将所有消息写入SD卡中的文本文件.但是onChange()内容观察器中的方法被多次调用,并且相同的消息被多次写入文本文件.怎么避免这个?另外我想知道内容观察者是否会放慢手机的速度.
我知道你很想把它标记为重复但等等,让我再次通过我的详细(但失败)尝试再次讨论这个问题.
策略1:算法: 答案
第一次触发onChange时,更新行的id
下次再次触发onChange时,会更新行的id
匹配id
忽略相同的id
这种方法的问题在于它很容易受到竞争条件的影响.如果在获得更新行的id时,onChange 第二次触发,则此算法失败.这源于我在慢速机器或以峰值容量工作的机器上进行测试时的个人经验.
策略2:算法:答案
覆盖deliverSelfNotifications()以返回true.
这看起来很有希望,但没有奏效.我用来参考的代码:
在主要活动:OnCreate方法我注册:
getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, new CtObserver(new Handler()));
Run Code Online (Sandbox Code Playgroud)
然后在一个单独的类中:
package com.example.testproject;
import android.database.ContentObserver;
import android.os.Handler;
import android.util.Log;
/**
* @author Time Traveller
*/
public class CtObserver extends ContentObserver {
public CtObserver(Handler handler) {
super(handler);
}
public boolean deliverSelfNotifications(){
return true;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.e("onChange","Fired");
}
}
Run Code Online (Sandbox Code Playgroud)
为什么您应该为此答案做出贡献:
Quering SMS content Provider是非默认应用程序捕获已发送SMS事件的唯一方法.但到目前为止,我还没有找到任何令人信服的完整功能的答案.所以我们真的需要对此有所了解!! …
sms android onchange android-contentprovider contentobserver
我正在尝试创建一个应用程序来计算来自手机的外发短信的数量.目前我有以下代码:
private void listenForSMS(){
Log.v("SMSTEST", "STARTED LISTENING FOR SMS OUTGOING");
Handler handle = new Handler(){};
SMSObserver myObserver = new SMSObserver(handle);
ContentResolver contentResolver = getContentResolver();
contentResolver.registerContentObserver(Uri.parse("content://sms"),true, myObserver);
}
private class SMSObserver extends ContentObserver{
int count = 0;
String lastMessage = null;
public SMSObserver(Handler handler) {
super(handler);
}
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.v("SMSTEST", "HIT ON CHANGE");
Uri uriSMSURI = Uri.parse("content://sms");
Cursor cur = getContentResolver().query(uriSMSURI, null, null,
null, null);
cur.moveToNext();
String protocol = cur.getString(cur.getColumnIndex("protocol"));
if(protocol == null){
count++;
Log.v("SMSTEST", "SMS SENT: …Run Code Online (Sandbox Code Playgroud)