web-dev-qa-db-fra.com

Comment implémenter un ContentObserver pour les journaux d'appels

J'aimerais savoir s'il existe un moyen de savoir si le fournisseur de contenu des appels a changé. Je veux dire, si je passe un appel ou si je réponds à un appel, il renvoie un "indicateur" indiquant qu'un nouveau journal a été ajouté au journal des appels ou à l'endroit où Android stocke des informations sur les appels.

Parce que, lorsque je passe un appel, Android stocke le numéro, le nom du contact (s'il existe), l'heure de l'appel, la durée, ..., le tout dans le fournisseur de contenu. Existe-t-il donc un moyen de capturer cet "indicateur" indiquant que le fournisseur de contenu des appels est plus important, ce qui signifie qu'une nouvelle donnée a été insérée dans le fournisseur de contenu CallLog.Calls.

J'ai donc encore beaucoup de doutes sur ce problème. Je ne sais pas où inscrire l'observateur de contenu. Mon intention est, lorsque quelque chose change dans le fournisseur de contenu CallLog, la méthode d'insertion du code sera utilisée. 

Je veux dire, le code ne fera rien sauf si de nouvelles données ont été ajoutées au fournisseur de contenu CallLog. Si des données ont été ajoutées au fournisseur de contenu CallLog, le code interroge les nouvelles données, puis les insère. Je veux le faire, car sans un observateur de contenu, l'application insérait des données déjà insérées dans la base de données à chaque fois que j'exécutais l'application.

Alors voici mon code. Si quelqu'un pouvait me dire où mettre registerContentObserver() et tout le reste.

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

Voici la réponse. N'oubliez pas d'inscrire l'observateur de contenu avec cette méthode:

registerContentObserver (Uri uri, boolean notifyForDescendents, ContentObserver observer)

Et puis vous pouvez le créer comme ça.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.getApplicationContext()
    .getContentResolver()
    .registerContentObserver(
            Android.provider.CallLog.Calls.CONTENT_URI, true,
            new MyContentObserver(handler)); 
}

class MyContentObserver extends ContentObserver {
    public MyContentObserver(Handler h) {
        super(h);
    }

    @Override
    public boolean deliverSelfNotifications() {
        return true;
    }

    @Override
    public void onChange(boolean selfChange) {
        Log.d(LOG_TAG, "MyContentObserver.onChange("+selfChange+")");
        super.onChange(selfChange);

        // here you call the method to fill the list
    }
}
34
rogcg

Créez simplement une nouvelle sous-classe de la classe ContentObserver et remplacez sa méthode onChange (). La méthode onChange () contiendra tout le code qui sera exécuté lors du changement de contenu. 

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

Il vous suffit ensuite d’enregistrer votre fournisseur de contenu auprès de l’URI. 

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

N'oubliez pas de désenregistrer votre objet observateur de contenu, sinon vous risquez une fuite de mémoire.

Source: Utilisez ContentObserver d'Android pour réagir aux modifications de contenu

1
Aditya Thakker