Pregunta Cómo implementar ContentObserver para registros de llamadas


Me gustaría saber si hay una manera de saber si el proveedor de contenido de llamadas ha cambiado. Quiero decir, si hago una llamada o respondo una llamada, devuelve un "indicador" de que se ha agregado un nuevo registro al registro de llamadas, o el lugar donde la tienda de Android informa sobre los llamados.

Porque, cuando hago una llamada, Android almacena el número, el nombre del contacto (si existe), la hora de la llamada, la duración, ..., todo en el proveedor de contenido. Entonces, hay una manera de capturar esta "bandera" que dice que el proveedor de contenido de llamadas es más grande, es decir, que se han insertado datos nuevos en el proveedor de contenido CallLog.Calls.

Entonces, todavía tengo muchas dudas relacionadas con este tema. No sé dónde registrar el contenido del observador. Mi intención es que, cuando algo cambie en el proveedor de contenido de CallLog, se use el método de inserción del código.

Quiero decir, el código no hará nada a menos que se hayan agregado nuevos datos al proveedor de contenido de CallLog. Si se han agregado algunos datos al proveedor de contenido de CallLog, el código consultará los datos nuevos y luego los insertará. Quiero hacer esto, porque sin un observador de contenido la aplicación estaba insertando datos en la base de datos que ya estaba insertada cada vez que ejecuto la aplicación, ¿entiendes?

Así que aquí está mi código. Si alguien pudiera decirme dónde poner registerContentObserver() y todo lo demás que se necesita.

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

20
2017-12-12 15:39


origen


Respuestas:


Aquí está la respuesta. No te olvides de registrar el contenido del observador con este método:

registerContentObserver (Uri uri, boolean notifyForDescendents, ContentObserver observer)

Y luego puedes crearlo así.

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
2017-12-14 02:55



Simplemente cree una nueva subclase de la clase ContentObserver y anule su método onChange (). El método onChange () contendrá todo el código que se ejecutará en el cambio de contenido.

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

Entonces, todo lo que tiene que hacer es registrar su proveedor de contenido en el URI.

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

Recuerde anular el registro de su objeto de observación de contenido o puede provocar una pérdida de memoria.

Fuente: Utilice ContentObserver de Android para reaccionar ante los cambios de contenido


1
2018-04-11 09:05