2013-07-21 34 views
0

我想實現一個程序,每次撥打電話或發送短信時都會在數據庫中插入詳細信息。我應該使用廣播接收器還是內容觀察器或服務?什麼是合適的?我對android很陌生,迫切需要幫助。在Android數據庫中插入通話記錄

我現在已經完成了以下代碼。這個問題是當第一次運行代碼時,例如呼叫日誌有8條記錄,所以這8條記錄被插入到數據庫中。那麼如果在通話記錄中發生任何變化,例如我撥打了另一個電話,那麼17條記錄將顯示在數據庫中,而不是9條。請幫助我在哪裏出錯?

package com.calllogdb; 

import java.text.DateFormat; 
import java.util.ArrayList; 
import java.util.Date; 




import android.os.Bundle; 
import android.os.Handler; 
import android.app.Activity; 
import android.content.ContentValues; 
import android.database.ContentObserver; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.Toast; 

//import static android.provider.BaseColumns._ID; 
import static com.calllogdb.Constants.KEY_ContactNum ; 
import static com.calllogdb.Constants.KEY_ContactName; 
import static com.calllogdb.Constants.KEY_Duration; 
import static com.calllogdb.Constants.KEY_Date ; 
import static com.calllogdb.Constants.KEY_NumType ; 
import static com.calllogdb.Constants.KEY_CurrTime ; 
import static com.calllogdb.Constants.TABLE_NAME; 

public class MainActivity extends Activity { 

    private Helper helper = new Helper(this); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
      this.getApplicationContext() 
      .getContentResolver() 
      .registerContentObserver(
        android.provider.CallLog.Calls.CONTENT_URI, true, 
        new CallLogObserver(new Handler())); 



     try { 

      addLog(); 
     } 
    finally { 

     helper.close(); 
    } 
    } 

    private void addLog() { 


     // TODO Auto-generated method stub 
     SQLiteDatabase db; 

     Cursor cursor = getContentResolver().query(
        android.provider.CallLog.Calls.CONTENT_URI, null, null, null, 
        android.provider.CallLog.Calls.DATE + " DESC "); 

    db = helper.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(KEY_ContactName, contactName); 
     values.put(KEY_NumType, numType); 
      values.put(KEY_ContactNum, contactNumber); 
      values.put(KEY_Duration, duration); 
      values.put(KEY_Date, callDate); 
      values.put(KEY_CurrTime, currTime); 

      db.insert(TABLE_NAME, null, values); 


      callList.add("Contact Number: " + contactNumber 
        + "\nContact Name: " + contactName + "\nDuration: " 
        + duration + "\nDate: " + callDate); 


     } while (cursor.moveToNext()); 
} 
    Toast.makeText(getBaseContext(), "Inserted!", Toast.LENGTH_LONG).show(); 


    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 




    public class CallLogObserver extends ContentObserver 
    { 



     public CallLogObserver(Handler handler) { 
      super(handler); 
      // TODO Auto-generated constructor stub 
     } 


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

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

      } 





    } 
} 

每當我在打電話就得到通知,並插入一整套的記錄,而不是隻有最新one.What應該怎樣做才能避免這種情況? 謝謝

回答

0

您可能再次將整個呼叫日誌插入到數據庫中。您可以使用內容觀察器或廣播監聽器來了解進行的調用,但是您需要保持上次讀取完整的呼叫日誌數據庫的時間,並且只需要插入在該時間之後進行的調用。

如果您使用contentobserver,觀察者需要在服務中。在onCreate()中註冊觀察者。您將在contentObserver的onChange中使用contentProvider。當您上次使用共享首選項讀取數據庫時,您將需要保持時間。請注意存儲在共享首選項中的時間之後的條目更改。現在將共享首選項的時間更新爲當前時間。也註銷onDestroy()中的內容觀察者。

+0

你能用簡單的例子來解釋一下嗎? – user2011302

+0

假設您在1:00時間從號碼x y和z有通話記錄。您讀取這些日誌並以共享首選項存儲1:00的紀元時間。下一次您的觀察者在呼叫新號碼x1時以1:40被呼叫。您將在1:00之後使用內容提供商查詢數字,這將返回x1,因爲它是1:00之後的唯一數字(存儲在共享偏好中)。你可以將這些值添加到你的數據庫中,或者做任何你想做的事情。現在將共享首選項的時間更新爲1:40(再次使用新紀元時間) – anon

+0

謝謝,請試試這個。 – user2011302