Android的ContentObserver的onChange()只返回falseContentObserver、Android、false、onChange

2023-09-05 05:17:40 作者:奈川崎

我想实现一个ContentObserver为CallLog.Calls内容提供商。我的意思是,如果我打个电话,或者接听电话等,观察者必须通知我,CallLog.Calls内容提供商发生了变化。但onchange的方法只返回false,即使有观察家登记,并通知。也许我做错了什么。

这是我的code。这是一个活动。

 包com.psyhclo;


公共类RatedCalls扩展ListActivity {

私有静态最后弦乐LOG_TAG =RatedCallsObserver;
私人处理程序处理程序=新的处理程序();
私人RatedCallsContentObserver callsObserver = NULL;
私人SQLiteDatabase分贝;
私人CallDataHelper DH = NULL;
StringBuilder的SB =新的StringBuilder();
OpenHelper openHelper =新OpenHelper(RatedCalls.this);

类RatedCallsContentObserver扩展ContentObserver {
    公共RatedCallsContentObserver(处理器高){
        超(H);
    }

    公共无效的onChange(布尔selfChange){
        Log.d(LOG_TAG,RatedCallsContentObserver.onChange(+ selfChange
                +));
    }
}

@覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    registerContentObservers();
    fillList();
}

@覆盖
公共无效的OnStart(){

    super.onStart();
    registerContentObservers();

}

@覆盖
公共无效的onStop(){

    super.onStop();
    unregisterContentObservers();

}

私人无效fillList(){

    光标光标= getContentResolver()查询(
            android.provider.CallLog.Calls.CONTENT_URI,NULL,NULL,NULL,
            android.provider.CallLog.Calls.DATE +降序);

    cursor.setNotificationUri(getBaseContext()。getContentResolver(),
            android.provider.CallLog.Calls.CONTENT_URI);

    DH =新CallDataHelper(本);
    DB = openHelper.getWritableDatabase();

    startManagingCursor(光标);
    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_NUMBER_TYPE);
    // INT contactIdColumnId =
    // cursor.getColumnIndex(android.provider.ContactsContract.RawContacts.CONTACT_ID);

    日期DT =新的日期();
    INT小时= dt.getHours();
    INT分钟= dt.getMinutes();
    INT秒= dt.getSeconds();
    串currTime =小时+:+分钟+:+秒;

    ArrayList的<字符串>呼叫清单=新的ArrayList<字符串>();
    如果(cursor.moveToFirst()){

        做 {

            字符串contactNumber = cursor.getString(numberColumnId);
            字符串CONTACTNAME = cursor.getString(contactNameId);
            字符串长度= cursor.getString(durationId);
            。字符串callDate = DateFormat.getDateInstance()格式(dateId);
            字符串numType = cursor.getString(numTypeId);

            ContentValues​​值=新ContentValues​​();

            values​​.put(CONTACT_ID,1);
            values​​.put(CONTACT_NAME,联系人姓名);
            values​​.put(NUMBER_TYPE,numType);
            values​​.put(contact_number,contactNumber);
            values​​.put(持续时间,持续时间);
            values​​.put(日期,callDate);
            values​​.put(CURRENT_TIME,currTime);
            values​​.put(CONT,1);

            getBaseContext()。getContentResolver()。有NotifyChange(
                    android.provider.CallLog.Calls.CONTENT_URI,NULL);
            this.db.insert(CallDataHelper.TABLE_NAME,空,价值观);

            Toast.makeText(getBaseContext(),插入!,Toast.LENGTH_LONG);
            callList.add(联络号码:+ contactNumber
                    +\ n请联系姓名:+联系人姓名+\ nDuration:
                    持续时间+ +\ nDate:+ callDate);

        }而(cursor.moveToNext());
    }
    setListAdapter(新ArrayAdapter<字符串>(这一点,R.layout.listitem,
            呼叫清单));
    ListView的LV = getListView();
    lv.setTextFilterEnabled(真正的);

    lv.setOnItemClickListener(新android.widget.AdapterView.OnItemClickListener(){

        @覆盖
        公共无效onItemClick(适配器视图<>母公司视图中查看,
                INT位置,长的id){

            Toast.makeText(getApplicationContext(),
                    ((TextView中)查看).getText(),Toast.LENGTH_SHORT).show();

        }
    });

}

私人无效registerContentObservers(){
    ContentResolver的CR = getContentResolver();
    callsObserver =新RatedCallsContentObserver(处理);
    cr.registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI,
            如此,callsObserver);
}

私人无效unregisterContentObservers(){

    ContentResolver的CR = getContentResolver();
    如果(callsObserver!= NULL){//只是妄想
        cr.unregisterContentObserver(callsObserver);
        callsObserver = NULL;
    }

}
}
 

解决方案 retrofit原理分析,2021年Android高级面试题总结

这是这个问题的答案。

安卓的onChange()方法只返回false

I'm trying to implement a ContentObserver for CallLog.Calls content provider. I mean, If I make a call, or receive a call, etc, the observer must notify me that the CallLog.Calls content provider has changed. But the onchange method only returns false, even with the observers registered, and notified. Maybe I'm doing something wrong.

This is my code. It's an Activity.

package com.psyhclo;


public class RatedCalls extends ListActivity {

private static final String LOG_TAG = "RatedCallsObserver";
private Handler handler = new Handler();
private RatedCallsContentObserver callsObserver = null;
private SQLiteDatabase db;
private CallDataHelper dh = null;
StringBuilder sb = new StringBuilder();
OpenHelper openHelper = new OpenHelper(RatedCalls.this);

class RatedCallsContentObserver extends ContentObserver {
    public RatedCallsContentObserver(Handler h) {
        super(h);
    }

    public void onChange(boolean selfChange) {
        Log.d(LOG_TAG, "RatedCallsContentObserver.onChange( " + selfChange
                + ")");
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    registerContentObservers();
    fillList(); 
}

@Override
public void onStart() {

    super.onStart();
    registerContentObservers();

}

@Override
public void onStop() {

    super.onStop();
    unregisterContentObservers();

}

private void fillList() {

    Cursor cursor = getContentResolver().query(
            android.provider.CallLog.Calls.CONTENT_URI, null, null, null,
            android.provider.CallLog.Calls.DATE + " DESC ");

    cursor.setNotificationUri(getBaseContext().getContentResolver(),
            android.provider.CallLog.Calls.CONTENT_URI);

    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);
    // int contactIdColumnId =
    // cursor.getColumnIndex(android.provider.ContactsContract.RawContacts.CONTACT_ID);

    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);

            getBaseContext().getContentResolver().notifyChange(
                    android.provider.CallLog.Calls.CONTENT_URI, null);
            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();

        }
    });

}

private void registerContentObservers() {
    ContentResolver cr = getContentResolver();
    callsObserver = new RatedCallsContentObserver(handler);
    cr.registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI,
            true, callsObserver);
}

private void unregisterContentObservers() {

    ContentResolver cr = getContentResolver();
    if (callsObserver != null) { // just paranoia
        cr.unregisterContentObserver(callsObserver);
        callsObserver = null;
    }

}
}

解决方案

This is the answer for this question.

Android onChange() method only returns false