2010-12-12 36 views
20

Tôi muốn biết liệu có cách nào để biết liệu nhà cung cấp nội dung của các cuộc gọi đã thay đổi hay chưa. Ý tôi là, nếu tôi thực hiện cuộc gọi, hoặc tôi trả lời cuộc gọi, nó sẽ trả về một "lá cờ" rằng nhật ký mới đã được thêm vào nhật ký cuộc gọi hoặc nơi lưu trữ thông tin về các cuộc gọi trên Android.Cách triển khai ContentObserver cho nhật ký cuộc gọi

Bởi vì, khi tôi thực hiện cuộc gọi, Android lưu trữ số điện thoại, tên liên lạc (nếu có), giờ gọi, thời lượng, ..., tất cả trong nhà cung cấp nội dung. Vì vậy, có một cách để nắm bắt "cờ" này nói rằng nhà cung cấp nội dung của các cuộc gọi lớn hơn, tôi có nghĩa là, một dữ liệu mới đã được chèn vào nhà cung cấp nội dung CallLog.Calls.

Vì vậy, tôi vẫn còn rất nhiều nghi ngờ liên quan đến vấn đề này. Tôi không biết phải đăng ký người quan sát nội dung ở đâu. Ý định của tôi là, khi một cái gì đó thay đổi trong nhà cung cấp nội dung CallLog, phương pháp chèn mã sẽ được sử dụng.

Ý tôi là, mã sẽ không làm bất cứ điều gì trừ khi dữ liệu mới đã được thêm vào nhà cung cấp nội dung CallLog. Nếu một số dữ liệu đã được thêm vào nhà cung cấp nội dung CallLog, thì mã sẽ truy vấn dữ liệu mới và sau đó sẽ chèn dữ liệu. Tôi muốn làm điều này, bởi vì không có người quan sát nội dung, ứng dụng đang chèn dữ liệu vào cơ sở dữ liệu đã được chèn vào mỗi lần tôi chạy ứng dụng, phải không?

Vì vậy, đây là mã của tôi. Nếu ai đó có thể cho tôi biết nơi để đặt registerContentObserver() và mọi thứ khác cần thiết.

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

Trả lời

34

Đây là câu trả lời. Đừng quên đăng ký người quan sát nội dung bằng phương pháp này:

registerContentObserver (Uri uri, boolean notifyForDescendents, ContentObserver observer) 

Và sau đó bạn có thể tạo nó như thế này.

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

đừng quên hủy đăng ký nhà cung cấp trong phương thức onDestroy(). – moonlightcheese

+0

điều gì sẽ xảy ra nếu bạn không? tôi thấy rằng để unregister người quan sát, tôi phải giữ nó trong bộ nhớ, mà tôi không muốn làm. –

+2

trong dòng mới RatedCallsContentObserver (handler)); người xử lý đến từ đâu/tại sao tôi cần điều này? cảm ơn! –

1

Chỉ cần tạo một lớp con mới của lớp ContentObserver và ghi đè lên phương thức onChange() của nó. Phương thức onChange() sẽ chứa tất cả mã sẽ được thực thi khi thay đổi nội dung.

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

Sau đó, tất cả những gì bạn phải làm là đăng ký nhà cung cấp nội dung của bạn cho URI.

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

Nhớ hủy đăng ký đối tượng quan sát nội dung của bạn hoặc nếu không nó có thể dẫn đến rò rỉ bộ nhớ.

Nguồn: Use Android's ContentObserver To React On Content Changes

Các vấn đề liên quan