2010-12-12 34 views
20

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

risposta

34

Ecco la risposta. Non dimenticare di registrare l'osservatore del contenuto con questo metodo:

registerContentObserver (Uri uri, boolean notifyForDescendents, ContentObserver observer) 

E quindi puoi crearlo in questo modo.

+5

non dimenticare di annullare la registrazione del fornitore nel metodo OnDestroy(). – moonlightcheese

+0

cosa succede se non lo fai? trovo che per annullare la registrazione dell'osservatore, devo tenerlo in memoria, che preferirei non fare. –

+2

nella riga nuovo RatedCallsContentObserver (gestore)); da dove viene il conduttore/perché ho bisogno di questo? Grazie! –

1

Basta creare una nuova sottoclasse di classe ContentObserver e sovrascrivere il metodo onChange(). Il metodo onChange() conterrà tutto il codice che verrà eseguito sulla modifica del contenuto.

public class MyObserver extends ContentObserver { 
    public MyObserver(Handler handler) { 
      super(handler); 
     } 

    @Override 
    public void onChange(boolean selfChange) { 
     this.onChange(selfChange,null); 
    } 

    @Override 
    public void onChange(boolean selfChange, Uri uri) { 
     //Write your code here  } 
} 

Quindi tutto ciò che dovete fare è registrare il vostro fornitore di contenuti nell'URI.

getContentResolver().registerContentObserver(YourURI,true,myObserver); 

Ricordarsi di annullare la registrazione dell'oggetto di osservazione del contenuto altrimenti può causare perdite di memoria.

Fonte: Use Android's ContentObserver To React On Content Changes

Problemi correlati