Android 如何知道呼叫的内容提供商已更改

Android 如何知道呼叫的内容提供商已更改,android,android-contacts,android-contentprovider,calllog,Android,Android Contacts,Android Contentprovider,Calllog,嘿,我想知道是否有办法知道呼叫内容提供商是否改变了。我的意思是,如果我打一个电话,或者我接听一个电话,它会返回一个“标志”,表明一个新的日志已添加到呼叫日志中,或者是Android存储有关呼叫信息的位置 因为,当我打电话时,Android会将号码、联系人姓名(如果存在)、通话时间、持续时间等等存储在内容提供商中。那么,有没有一种方法可以捕获这个“标志”,即呼叫的内容提供商更大,我的意思是,在内容提供商CallLog.Calls上插入了一个新数据 (更新) 所以我对这个问题还是有很多疑问。我不知道

嘿,我想知道是否有办法知道呼叫内容提供商是否改变了。我的意思是,如果我打一个电话,或者我接听一个电话,它会返回一个“标志”,表明一个新的日志已添加到呼叫日志中,或者是Android存储有关呼叫信息的位置

因为,当我打电话时,Android会将号码、联系人姓名(如果存在)、通话时间、持续时间等等存储在内容提供商中。那么,有没有一种方法可以捕获这个“标志”,即呼叫的内容提供商更大,我的意思是,在内容提供商CallLog.Calls上插入了一个新数据

(更新)

所以我对这个问题还是有很多疑问。我不知道在哪里注册内容观察员。我的意图是,当CallLog内容提供程序中发生更改时,将使用代码的insert方法

我的意思是,除非向CallLog内容提供程序添加了新数据,否则代码不会起任何作用。如果某些数据已添加到CallLog内容提供程序,则代码将查询新数据,然后插入。我之所以要这样做,是因为如果没有内容观察者,应用程序就会在数据库中插入数据,而我每次运行应用程序时都会插入数据,明白吗?

这是我的代码。如果有人能告诉我把registerContentObserver放在哪里,还有其他需要的东西,我感谢你

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类中的方法。这允许您在内容提供程序后面的数据集发生更改时注册回调

有关如何观察内容提供商的更改的工作示例,请参见