1

ねえ、私は、コールのコンテンツプロバイダが変更されたかどうかを知る方法があるかどうかを知りたいと思います。つまり、電話をかけると、コールに応答するか、コールログに新しいログが追加されたという「フラグ」、またはAndroidストアが呼び出しに関する情報を格納する場所が返されます。コールのコンテンツプロバイダーが変更されたことを知る方法

私は電話をかけると、Androidは番号、連絡先の名前(存在する場合)、通話の時間、期間、何らかの情報をコンテンツプロバイダに保存するためです。だから、この "フラグ"を呼び出して、呼び出し側のコンテンツプロバイダがより大きくなっているということです。コンテンツプロバイダCallLog.Callsに新しいデータが挿入されているということです。 (更新)

だから、私はまだこの問題に関連疑問がたくさんあります。私はコンテンツオブザーバーをどこに登録するか分かりません。私の意図は、CallLogコンテンツプロバイダの何かが変更されたときに、コードの挿入メソッドが使用されることです。

新しいデータが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(); 

     } 
    }); 
} 
} 

答えて

1

は、ContentResolverのクラスのメソッドregisterContentObserver()を見てください。これにより、コンテンツプロバイダの背後にあるデータセットが変更された場合にコールバックを登録できます。

this blog postingも参照してください。コンテンツプロバイダの変更の観察方法の実例です。

関連する問題