I'm experiencing this problem. I have attached a content observer for the events URI.
On Jun 10, 8:44 am, Roger <roger.cam...@gmail.com> wrote: > I haven't found any solution for this problem in the bunch of > questions and reference I've searched. > > So here is. > > I'm trying to query the data from the CallLog and insert in DB. For > that, I've created a COntentObserver as inner class in a Service, and > inside onChange() method, I call my method that goes to the specified > URI and query the data that has changed. > > But, lets say, I received a call, so the observer was notified. So, my > method goes to the call log content provider, query and insert, but it > is inserting two, three times the same register. > > And the funny is that I have another service implemented identically > like this one, but, it doesnt happen. > > Here is the code of my service. > > public class RatedCallsService extends Service > > private Handler handler = new Handler(); > private SQLiteDatabase db; > private OpenHelper helper; > private String theDate; > private String theMonth_; > private String theYear_; > private String theDay_; > public static boolean servReg = false; > > class RatedCallsContentObserver extends ContentObserver { > > public RatedCallsContentObserver(Handler h) { > > super(h); > //helper = new OpenHelper(getApplicationContext()); > //db = helper.getWritableDatabase(); > > } > > @Override > public boolean deliverSelfNotifications() { > > return true; > > } > > @Override > public void onChange(boolean selfChange) { > > super.onChange(selfChange); > Log.i(LOG_TAG, "Inside on Change. selfChange " + > selfChange); > searchInsert(); > } > } > > @Override > public IBinder onBind(Intent arg0) { > > return null; > > } > > @Override > > public void onCreate() { > servReg = true; > db = DataHandlerDB.createDB(this); > registerContentObserver(); > > } > > @Override > public void onDestroy() { > > super.onDestroy(); > db.close(); > > this.getApplicationContext().getContentResolver().unregisterContentObserver > (new > RatedCallsContentObserver(handler)); > > } > > private void searchInsert() { > > Cursor cursor = getContentResolver().query( > android.provider.CallLog.Calls.CONTENT_URI, null, null, > null, > android.provider.CallLog.Calls.DATE + " DESC "); > > if (cursor.moveToFirst()) { > > 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 numTypeId = cursor > > .getColumnIndex(android.provider.CallLog.Calls.CACHED_NUMBER_TYPE); > int callTypeId = cursor > .getColumnIndex(android.provider.CallLog.Calls.TYPE); > > Date dt = new Date(); > int hours = dt.getHours(); > int minutes = dt.getMinutes(); > int seconds = dt.getSeconds(); > String currTime = hours + ":" + minutes + ":" + seconds; > > SimpleDateFormat dateFormat = new SimpleDateFormat("M/d/ > yyyy"); > > Date date = new Date(); > > cursor.moveToFirst(); > > String contactNumber = cursor.getString(numberColumnId); > String contactName = (null == > cursor.getString(contactNameId) ? "" > : cursor.getString(contactNameId)); > String duration = cursor.getString(durationId); > String numType = cursor.getString(numTypeId); > String callType = cursor.getString(callTypeId); > > seconds = Integer.parseInt(duration); > > theDate = dateFormat.format(date); > > if (theDate.length() == 9) { > > theMonth_ = theDate.substring(0, 1); > theDay_ = theDate.substring(2, 4); > theYear_ = theDate.substring(5, 9); > > } else if (theDate.length() == 10) { > > theMonth_ = theDate.substring(0, 2); > theDay_ = theDate.substring(3, 4); > theYear_ = theDate.substring(6, 10); > > } else if (theDate.length() == 8) { > > theMonth_ = theDate.substring(0, 1); > theDay_ = theDate.substring(2, 3); > theYear_ = theDate.substring(4, 8); > > } > > ContentValues values = new ContentValues(); > ContentValues values2 = 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", Utilities.convertTime(seconds)); > values.put("date", dateFormat.format(date)); > values.put("current_time", currTime); > values.put("cont", 1); > values.put("type", callType); > > values2.put("month", > Utilities.monthName(Integer.parseInt(theMonth_))); > values2.put("duration", Utilities.convertTime(seconds)); > values2.put("year", theYear_); > values2.put("month_num", Integer.parseInt(theMonth_)); > > if (!db.isOpen()) { > db = getApplicationContext() > .openOrCreateDatabase( > "/data/data/com.project.myapp/databases/ > myDb.db", > SQLiteDatabase.OPEN_READWRITE, null); > } > if (duration != "") { > if (Integer.parseInt(duration) != 0) { > > String existingMonthDuration = DataHandlerDB > .selectMonthsDuration(theMonth_, theYear_, > this); > Integer newMonthDuration; > > if (existingMonthDuration != "") { > > newMonthDuration = Integer > .parseInt(existingMonthDuration) > + > Integer.parseInt(duration); > > values2.put("duration", > Utilities.convertTime(newMonthDuration)); > db.update(DataHandlerDB.TABLE_NAME_3, values2, > "year = ?", new String[] { theYear_ }); > > } else { > > db.insert(DataHandlerDB.TABLE_NAME_3, null, > values2); > > } > > db.insert(DataHandlerDB.TABLE_NAME_2, null, values); > > } > } > cursor.close(); > > } > > } > > public void registerContentObserver() { > > this.getApplicationContext() > .getContentResolver() > .registerContentObserver( > > android.provider.CallLog.Calls.CONTENT_URI, false, > new RatedCallsContentObserver(handler)); > > } > } > > I've tried everything. unregistering the observer, etc. but nothing. > Thanks in advance. -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en