Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onChange()方法只返回false_Android_Android Contentprovider_Android Context_Calllog_Android Sdk 2.3 - Fatal编程技术网

Android onChange()方法只返回false

Android onChange()方法只返回false,android,android-contentprovider,android-context,calllog,android-sdk-2.3,Android,Android Contentprovider,Android Context,Calllog,Android Sdk 2.3,我在活动中将ContentObserver onChange()声明为子类。但它总是返回false。谁能告诉我为什么 (更新) 如果CallLog内容提供程序发生更改,则此代码必须调用fillList。我的意思是,如果我进行一个新的调用,那么调用的数据将插入到内容提供程序中,因此它必须返回给观察者那里发生了变化,因此它将调用fillList()。但是它总是返回false,即使我在emulator上进行了一个新的调用 这是代码 public class RatedCalls extends

我在活动中将ContentObserver onChange()声明为子类。但它总是返回false。谁能告诉我为什么

(更新) 如果CallLog内容提供程序发生更改,则此代码必须调用fillList。我的意思是,如果我进行一个新的调用,那么调用的数据将插入到内容提供程序中,因此它必须返回给观察者那里发生了变化,因此它将调用fillList()。但是它总是返回false,即使我在emulator上进行了一个新的调用

这是代码

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

            callList.add("Contact Number: " + contactNumber
                    + "\nContact Name: " + contactName + "\nDuration: "
                    + duration + "\nDate: " + callDate);
            this.db.insert(CallDataHelper.TABLE_NAME, null, values);
            Toast.makeText(getBaseContext(), "Inserted!", Toast.LENGTH_LONG);

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

}
}
公共类RatedCalls扩展了ListActivity{
私有静态最终字符串日志\u TAG=“RatedCallsObserver”;
私有处理程序=新处理程序();
private RatedCallsContentTobServer调用SobServer=null;
专用数据库数据库;
private CallDataHelper dh=null;
StringBuilder sb=新的StringBuilder();
OpenHelper OpenHelper=新的OpenHelper(RatedCalls.this);
类RatedCallsContentObserver扩展ContentObserver{
公用费率呼叫内容服务器(处理程序h){
超级(h);
}
公共void onChange(布尔自更改){
Log.d(Log_标记,“RatedCallsContentTobServer.onChange”(“+selfChange
+ ")");
}
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
RegisterContentObserver();
填充列表();
}
@凌驾
public void onStart(){
super.onStart();
RegisterContentObserver();
}
@凌驾
公共void onStop(){
super.onStop();
未注册的内容观察员();
}
私有无效填充列表(){
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=新的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类型);
//int contactIdColumnId=
//cursor.getColumnIndex(android.provider.ContactsContract.RawContacts.CONTACT\u ID);
日期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);
getBaseContext().getContentResolver().notifyChange(
android.provider.CallLog.Calls.CONTENT_URI,null);
添加(“联系人号码:”+联系人号码
+\n联系人名称:“+contactName+”\n联系人:
+持续时间+“\n日期:”+callDate);
this.db.insert(CallDataHelper.TABLE_NAME,null,value);
Toast.makeText(getBaseContext(),“Inserted!”,Toast.LENGTH\u LONG);
}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\u SHORT)
.show();
}
});
}
}
私有void RegisterContentObserver(){
ContentResolver cr=getContentResolver();
callsObserver=newratedcallscontentobserver(处理程序);
cr.registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI,
true,callsObserver);
}
私有void unregisterContentObservators(){
ContentResolver cr=getContentResolver();
如果(callsObserver!=null){//只是妄想症
cr.unregisterecontentobserver(callsObserver);
callsObserver=null;
}
}
}

函数不返回false,因为它不返回任何内容。其返回类型为
void
。它接收false作为参数

为什么?

我在Google中输入了“android onchange”并选择了第一个结果,结果如下:

This method is called when a change occurs to the cursor that is being observed.
Parameters
selfChange    true if the update was caused by a call to commit on the cursor
              that is being observed. 
因此,所发生的一切就是通过调用其
.commit()
方法更改了光标,而不是。如果调用了
.commit()
,您将只记录此函数的“true”输入。

我的观点是“这就是如何应用一些基本的问题解决技能,至少更好地了解正在发生的事情”。但无论如何。。。即使在某个地方调用
.commit()
,也只会导致