1

Hey, ich würde gerne wissen, ob es eine Möglichkeit gibt, zu erfahren, ob sich der Inhaltanbieter von Berufungen geändert hat. Ich meine, wenn ich einen Anruf tätige oder einen Anruf entgegennehme, wird ein "Flag" angezeigt, dass dem Anrufprotokoll ein neues Protokoll hinzugefügt wurde, oder der Ort, an dem Android Informationen über Anrufe speichert.Wie Sie wissen, dass sich der Inhaltsanbieter von Anrufen geändert hat

Weil, wenn ich telefoniere, speichert Android die Nummer, den Kontaktnamen (falls vorhanden), die Stunde des Anrufs, die Dauer, blah blah blah, alles im Content-Provider. Also gibt es eine Möglichkeit, diese "Flagge" zu erfassen, die besagt, dass der Content-Anbieter von Callings größer ist, ich meine, dass neue Daten in den Content-Provider CallLog.Calls eingefügt wurden.

(aktualisiert)

Also, ich habe noch eine Menge Zweifel an diesem Problem. Ich weiß nicht, wo ich den Inhaltsbeobachter registrieren soll. Meine Absicht ist, wenn sich etwas im CallLog-Inhaltsanbieter ändert, wird die Einfügemethode des Codes verwendet.

Ich meine, der Code wird nichts tun, wenn dem CallLog Content Provider keine neuen Daten hinzugefügt wurden. Wenn dem CallLog-Inhaltsanbieter einige Daten hinzugefügt wurden, fragt der Code die neuen Daten ab und fügt sie dann ein. Ich möchte dies tun, weil die Anwendung ohne einen Content-Observer Daten in die Datenbank eingefügt hat, die bereits jedes Mal eingefügt wurde, wenn ich die Anwendung starte, verstanden?

Also hier ist mein Code. Wenn mir jemand sagen könnte, wo ich den registerContentObserver ablegen soll und alles andere ist nötig, danke ich dir.

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

     } 
    }); 
} 
} 

Antwort

1

Werfen Sie einen Blick auf die Methode registerContentObserver() in der ContentResolver Klasse. Dadurch können Sie einen Rückruf registrieren, wenn sich der Datensatz hinter dem Inhaltsanbieter ändert.

Siehe auch this blog posting für ein funktionierendes Beispiel, wie man einen Inhaltsanbieter für Änderungen beobachten kann.