Android 如何知道呼叫的内容提供商已更改
嘿,我想知道是否有办法知道呼叫内容提供商是否改变了。我的意思是,如果我打一个电话,或者我接听一个电话,它会返回一个“标志”,表明一个新的日志已添加到呼叫日志中,或者是Android存储有关呼叫信息的位置 因为,当我打电话时,Android会将号码、联系人姓名(如果存在)、通话时间、持续时间等等存储在内容提供商中。那么,有没有一种方法可以捕获这个“标志”,即呼叫的内容提供商更大,我的意思是,在内容提供商CallLog.Calls上插入了一个新数据 (更新) 所以我对这个问题还是有很多疑问。我不知道在哪里注册内容观察员。我的意图是,当CallLog内容提供程序中发生更改时,将使用代码的insert方法 我的意思是,除非向CallLog内容提供程序添加了新数据,否则代码不会起任何作用。如果某些数据已添加到CallLog内容提供程序,则代码将查询新数据,然后插入。我之所以要这样做,是因为如果没有内容观察者,应用程序就会在数据库中插入数据,而我每次运行应用程序时都会插入数据,明白吗? 这是我的代码。如果有人能告诉我把registerContentObserver放在哪里,还有其他需要的东西,我感谢你Android 如何知道呼叫的内容提供商已更改,android,android-contacts,android-contentprovider,calllog,Android,Android Contacts,Android Contentprovider,Calllog,嘿,我想知道是否有办法知道呼叫内容提供商是否改变了。我的意思是,如果我打一个电话,或者我接听一个电话,它会返回一个“标志”,表明一个新的日志已添加到呼叫日志中,或者是Android存储有关呼叫信息的位置 因为,当我打电话时,Android会将号码、联系人姓名(如果存在)、通话时间、持续时间等等存储在内容提供商中。那么,有没有一种方法可以捕获这个“标志”,即呼叫的内容提供商更大,我的意思是,在内容提供商CallLog.Calls上插入了一个新数据 (更新) 所以我对这个问题还是有很多疑问。我不知道
package com.psyhclo;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import com.psyhclo.R;
import com.psyhclo.CallDataHelper.OpenHelper;
import android.app.Activity;
import android.app.ListActivity;
import android.database.ContentObserver;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Handler;
import android.provider.ContactsContract.RawContacts;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.content.ContentValues;
import android.content.Context;
import android.content.ContentProvider;
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();
}
});
}
}
package com.psyhclo;
导入java.text.DateFormat;
导入java.util.ArrayList;
导入java.util.Date;
进口com.psyhclo.R;
导入com.psyhclo.CallDataHelper.OpenHelper;
导入android.app.Activity;
导入android.app.ListActivity;
导入android.database.ContentObserver;
导入android.database.Cursor;
导入android.database.sqlite.SQLiteDatabase;
导入android.os.Bundle;
导入android.os.Handler;
导入android.provider.contacts contract.raw联系人;
导入android.util.Log;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入android.widget.TextView;
导入android.widget.Toast;
导入android.content.ContentValues;
导入android.content.Context;
导入android.content.ContentProvider;
公共类RatedCalls扩展了ListActivity{
专用数据库数据库;
private CallDataHelper dh=null;
StringBuilder sb=新的StringBuilder();
OpenHelper OpenHelper=新的OpenHelper(RatedCalls.this);
创建时的公共void(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=新的CallDataHelper(此);
db=openHelper.getWritableDatabase();
开始管理游标(游标);
int numberColumnId=光标
.getColumnIndex(android.provider.CallLog.Calls.NUMBER);
int durationId=游标
.getColumnIndex(android.provider.CallLog.Calls.DURATION);
int contactNameId=游标
.getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME);
int dateId=cursor.getColumnIndex(android.provider.CallLog.Calls.DATE);
int numTypeId=游标
.getColumnIndex(android.provider.CallLog.Calls.CACHED\u NUMBER\u类型);
日期dt=新日期();
int hours=dt.getHours();
int minutes=dt.getMinutes();
int seconds=dt.getSeconds();
字符串currTime=hours+“:”+minutes+“:”+seconds;
ArrayList callList=新的ArrayList();
if(cursor.moveToFirst()){
做{
String contactNumber=cursor.getString(numberColumnId);
String contactName=cursor.getString(contactNameId);
String duration=cursor.getString(durationId);
字符串callDate=DateFormat.getDateInstance().format(日期ID);
String numType=cursor.getString(numTypeId);
ContentValues=新的ContentValues();
值。put(“联系人id”,1);
值。输入(“联系人姓名”,联系人姓名);
value.put(“数字类型”,numType);
值。输入(“联系人号码”,联系人号码);
值。put(“持续时间”,持续时间);
值。put(“日期”,callDate);
值。put(“当前时间”,currTime);
价值。put(“cont”,1);
this.db.insert(CallDataHelper.TABLE_NAME,null,value);
Toast.makeText(getBaseContext(),“Inserted!”,Toast.LENGTH\u LONG);
添加(“联系人号码:”+联系人号码
+\n联系人名称:“+contactName+”\n联系人:
+持续时间+“\n日期:”+callDate);
}while(cursor.moveToNext());
}
setListAdapter(新阵列适配器)(此,R.layout.listitem,
呼叫列表);
ListView lv=getListView();
lv.setTextFilterEnabled(真);
setOnItemClickListener(新的android.widget.AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
Toast.makeText(getApplicationContext(),
((TextView)view.getText(),Toast.LENGTH_SHORT.show();
}
});
}
}
查看ContentResolver类中的方法。这允许您在内容提供程序后面的数据集发生更改时注册回调
另请参见如何观察内容提供程序的更改的工作示例。查看ContentResolver类中的方法。这允许您在内容提供程序后面的数据集发生更改时注册回调
有关如何观察内容提供商的更改的工作示例,请参见