- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想知道是否有办法知道调用的内容提供者是否已更改。我的意思是,如果我调用电话或接听电话,它会返回一个“标志”,表明新日志已添加到通话记录中,或者 Android 存储有关通话信息的位置。
因为,当我调用电话时,Android 会将号码、联系人姓名(如果存在)、通话时间、持续时间等都存储在内容提供程序中。那么有没有办法捕获这个“标志”,它表明调用的内容提供者更大,我的意思是,已经在内容提供者 CallLog.Calls 上插入了一个新数据。
所以,我仍然对这个问题有很多疑问。我不知道在哪里注册内容观察者。我的 Intent 是,当 CallLog 内容提供程序发生变化时,将使用代码的 insert 方法。
我的意思是,除非新数据已添加到 CallLog 内容提供程序,否则代码不会执行任何操作。如果某些数据已添加到 CallLog 内容提供程序,则代码将查询新数据,然后将插入。我想这样做,因为在没有内容观察者的情况下,应用程序正在向数据库中插入数据,而这些数据在我每次运行应用程序时都已插入,明白了吗?
这是我的代码。如果有人能告诉我把 registerContentObserver()
和其他所有需要的东西放在哪里。
public class RatedCalls extends ListActivity {
private SQLiteDatabase db;
private CallDataHelper dh = null;
StringBuilder sb = new StringBuilder();
OpenHelper openHelper = new OpenHelper(RatedCalls.this);
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Cursor cursor = getContentResolver().query(
android.provider.CallLog.Calls.CONTENT_URI, null, null, null,
android.provider.CallLog.Calls.DATE + " DESC ");
dh = new CallDataHelper(this);
db = openHelper.getWritableDatabase();
startManagingCursor(cursor);
int numberColumnId = cursor.getColumnIndex(android.provider.CallLog.Calls.NUMBER);
int durationId = cursor.getColumnIndex(android.provider.CallLog.Calls.DURATION);
int contactNameId = cursor.getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME);
int dateId = cursor.getColumnIndex(android.provider.CallLog.Calls.DATE);
int numTypeId = cursor.getColumnIndex(android.provider.CallLog.Calls.CACHED_NUMBER_TYPE);
Date dt = new Date();
int hours = dt.getHours();
int minutes = dt.getMinutes();
int seconds = dt.getSeconds();
String currTime = hours + ":" + minutes + ":" + seconds;
ArrayList<String> callList = new ArrayList<String>();
if (cursor.moveToFirst()) {
do {
String contactNumber = cursor.getString(numberColumnId);
String contactName = cursor.getString(contactNameId);
String duration = cursor.getString(durationId);
String callDate = DateFormat.getDateInstance().format(dateId);
String numType = cursor.getString(numTypeId);
ContentValues values = new ContentValues();
values.put("contact_id", 1);
values.put("contact_name", contactName);
values.put("number_type", numType);
values.put("contact_number", contactNumber);
values.put("duration", duration);
values.put("date", callDate);
values.put("current_time", currTime);
values.put("cont", 1);
this.db.insert(CallDataHelper.TABLE_NAME, null, values);
Toast.makeText(getBaseContext(), "Inserted!", Toast.LENGTH_LONG);
callList.add("Contact Number: " + contactNumber
+ "\nContact Name: " + contactName + "\nDuration: "
+ duration + "\nDate: " + callDate);
} while (cursor.moveToNext());
}
setListAdapter(new ArrayAdapter<String>(this, R.layout.listitem, callList));
ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
}
});
}
}
最佳答案
这就是答案。不要忘记使用此方法注册内容观察者:
registerContentObserver (Uri uri, boolean notifyForDescendents, ContentObserver observer)
然后你可以像这样创建它。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getApplicationContext()
.getContentResolver()
.registerContentObserver(
android.provider.CallLog.Calls.CONTENT_URI, true,
new MyContentObserver(handler));
}
class MyContentObserver extends ContentObserver {
public MyContentObserver(Handler h) {
super(h);
}
@Override
public boolean deliverSelfNotifications() {
return true;
}
@Override
public void onChange(boolean selfChange) {
Log.d(LOG_TAG, "MyContentObserver.onChange("+selfChange+")");
super.onChange(selfChange);
// here you call the method to fill the list
}
}
关于android - 如何为通话记录实现 ContentObserver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4422410/
我设置了ContentObserver来检查服务中的音频更改。我想知道是否有办法将ContentObserver的触发限制为仅某些应用程序。 说,我正在玩一个可以更改音量的游戏,然后在设置中更改音量。
以下是我注册 ContentObserver 来监听发送的短信的方法: SendSmsObserver smsObeserver = (new SendSmsObserver(new Handler(
我已经阅读并阅读了相关的问答,无法相信如果我的自定义 ContentProvider 会做这样的事情: insertUri = ContentUris.withAppendedId( Data2Tab
我正在使用 ListView 编写简单的小部件。我想获得有关数据更改的即时更新,因此创建了 ContentObserver。我正在 RemoteViewFactory 子类中注册它。 @Overrid
除非我第二次运行应用程序,否则不会调用 ContactObserver 的 OnChange 方法。第一次运行使得安装似乎不会注册观察者,即使 onCreate 是从服务调用的。 第二次运行时,它运行
当用户将我的 appwidget 添加到主屏幕时,我正在注册一个 ContentObserver。预期的行为是对我的 ContentProvider 中的基础数据的更改将触发我的 appwidget
我实现了一个 ContentObserver,它运行良好。但是现在,每当 ContentObserver 收到有关 CallLog.Calls 内容提供程序中某些更改的通知时,它都会不停地运行 onC
我希望能够了解 SMS 或通话记录中的特定项目何时更改。当适当的内容提供者发生某些变化时,很容易收到通知,但是获取特定记录是完全低效的,因为需要维护商店的完整镜像,然后找出差异。这不仅是蹩脚的。有用的
在 ContentObserver 类中,方法 onChange 被传递一个 bool 值 selfChange,它被定义为:“如果更新是由对正在观察的游标上的提交调用引起的,则为真。” 更新游标以使
我已经从服务中注册了一个 ContentObserver 并且当电话中有更新(例如调用或联系人更新)时我得到了 onchange() 函数。但我希望仅在发生添加、更新或删除时调用 onchange()
我真的不明白为什么内容观察者会监听与联系信息无关的变化。 我只是注册到我想收听更改的 URI: getContentResolver().registerContentObserver(Contact
我有以下用于接收和写入 SMS 的 ContentObserver 实现,但它被调用了多次。 代码: public class SMSObserverActivity extends Activity
内容观察者是否在 Android 中持久存在?如果我在 Activity 中创建一个内容观察者,该观察者是否会继续运行,直到我删除观察者。 基本上,我正在创建一个 SMS 服务,在接收和发送时,我将
我有一系列文件要上传。这些作为条目存储在内容提供者中。每个条目还包含上传的百分比。 一个 Activity 显示上传列表,每个文件都是一个项目,带有 ProgressBar 以显示上传进度。 我更新进
什么是 ContentObserver 的生命周期?注册后,应用程序关闭后它是否仍然存在? 如果应用程序关闭后 ContentObserver 未注册,是否有解决方法?对于我的具体情况,我想监视电话联
我有一个 ContentProvider ,我正在使用它来填充我的 ListView。我需要单击其中一个 menu-item。它更新了我的数据集,但我需要在 ListView 中反射(reflect)
我在想实现体积变化检测的时候遇到了一个问题。由于必须通过服务在后台检测变化检测,所以我无法拦截音量键按下。 我试过 ContentObserver 来监听音量设置的变化,但没有成功。但我进一步挖掘,发
我想知道是否有办法知道调用的内容提供者是否已更改。我的意思是,如果我调用电话或接听电话,它会返回一个“标志”,表明新日志已添加到通话记录中,或者 Android 存储有关通话信息的位置。 因为,当我调
我有这个泄漏,任何猜测?这个类有一些奇怪的引用。我的代码的任何地方都没有 contentobserver In com.example:1.5.0:27. com.example.ui.record
我目前正在开发的应用程序必须对日历或事件数据库中的更改使用react,因此下面的 Observer 将注册到 URI: content://com.android.calendar (for olde
我是一名优秀的程序员,十分优秀!