Как реализовать ContentObserver для журналов вызовов

Я хотел бы знать, есть ли способ узнать, изменился ли контент-провайдер звонков. Я имею в виду, если я позвоню, или я отвечу на звонок, он вернет «флаг», который добавит новый журнал в журнал вызовов или место, где Android хранит информацию о звонках.

Потому что, когда я звоню, Android хранит номер, имя контакта (если существует), час вызова, продолжительность, …, все в контент-провайдере. Таким образом, есть способ захватить этот «флаг», который говорит, что контент-провайдер звонков больше, я имею в виду, что новые данные были вставлены в контент-провайдер CallLog.Calls.

Итак, у меня все еще есть много сомнений, связанных с этой проблемой. Я не знаю, где зарегистрировать наблюдателя контента. Мое намерение заключается в том, что когда что-то изменяется в провайдере контента CallLog, будет использоваться метод вставки кода.

Я имею в виду, что код ничего не сделает, если новые данные не будут добавлены в контент-провайдер CallLog. Если некоторые данные были добавлены в контент-провайдер CallLog, тогда код будет запрашивать новые данные, а затем будет вставляться. Я хочу сделать это, потому что без наблюдателя контента приложение вставляло данные в базу данных, которая уже была вставлена ​​каждый раз, когда я запускаю приложение, получил его?

Итак, вот мой код. Если кто-то скажет мне, где поставить registerContentObserver() и все остальное, что необходимо.

 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 callList = new ArrayList(); 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(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(); } }); } } 

    Вот ответ. Не забудьте зарегистрировать наблюдателя контента с помощью этого метода:

     registerContentObserver (Uri uri, boolean notifyForDescendents, ContentObserver observer) 

    И тогда вы можете создать его так.

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

    Просто создайте новый подclass classа ContentObserver и переопределите его метод onChange (). Метод onChange () будет содержать весь код, который будет выполнен при изменении содержимого.

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

    Тогда все, что вам нужно сделать, – зарегистрировать поставщика контента в URI.

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

    Не забудьте отменить регистрацию объекта наблюдателя контента, иначе это может привести к утечке памяти.

    Источник: использование ContentObserver для Android для реагирования на изменения содержимого

    Interesting Posts

    Что именно происходит, когда я устанавливаю LoadUserProfile пула IIS?

    Скрипт для связывания расширения с программой

    Почему #ifndef и #define используются в файлах заголовков C ++?

    Избегайте беды Invoke / BeginInvoke в обработке событий в WinForm для кросс-streamов?

    Как я должен объяснить разницу между интерфейсом и абстрактным classом?

    Уникальные (не повторяющиеся) случайные числа в O (1)?

    Как международные географические адреса должны храниться в реляционной базе данных?

    Как работает FetchMode в Spring Data JPA

    Как переместить файлы в папку архива после того, как файлы были обработаны?

    Созданы ли в резервном хранилище Windows 7 дифференциальные (инкрементные) резервные копии?

    Что лучше: @SuppressLint или @TargetApi?

    Как я могу иметь строчные маршруты в ASP.NET MVC?

    Шаблон MVC на Android

    Как я могу анимировать сортировку списка с помощью orderBy с помощью ng-repeat с ng-animate?

    Поиск в Windows 10 Start Menu не работает для новых приложений

    Давайте будем гением компьютера.