Vorrei sapere se c'è un modo per sapere se il fornitore di contenuti delle chiamate è cambiato. Voglio dire, se faccio una chiamata, o rispondo a una chiamata, restituisce un "flag" che è stato aggiunto un nuovo log al registro delle chiamate, o il luogo in cui le informazioni dello store di Android sulle chiamate.Come implementare un ContentObserver per i registri delle chiamate
Perché quando effettuo una chiamata, Android memorizza il numero, il nome del contatto (se esiste), l'ora della chiamata, la durata, ..., tutto nel provider di contenuti. Quindi c'è un modo per catturare questa "bandiera" che dice che il fornitore di contenuti delle chiamate è più grande, voglio dire, che un nuovo dato è stato inserito nel fornitore di contenuti CallLog.Calls.
Quindi, ho ancora molti dubbi legati a questo problema. Non so dove registrare l'osservatore dei contenuti. La mia intenzione è, quando qualcosa cambia nel fornitore di contenuti CallLog, verrà utilizzato il metodo di inserimento del codice.
Voglio dire, il codice non farà nulla a meno che non siano stati aggiunti nuovi dati al fornitore di contenuti CallLog. Se alcuni dati sono stati aggiunti al fornitore di contenuti CallLog, il codice interrogherà i nuovi dati e quindi inserirà. Voglio farlo, perché senza un osservatore di contenuto l'applicazione stava inserendo i dati nel database che era già inserito ogni volta che eseguo l'applicazione, capito?
Quindi ecco il mio codice. Se qualcuno potrebbe dirmi dove mettere e tutto il resto che è necessario.
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();
}
});
}
}
non dimenticare di annullare la registrazione del fornitore nel metodo OnDestroy(). – moonlightcheese
cosa succede se non lo fai? trovo che per annullare la registrazione dell'osservatore, devo tenerlo in memoria, che preferirei non fare. –
nella riga nuovo RatedCallsContentObserver (gestore)); da dove viene il conduttore/perché ho bisogno di questo? Grazie! –