Android アプリケーションで、コンテンツ オブザーバーを使用している通話ログを取得したいと考えています。ボタンをクリックすると、通話ログが表示されます。しかし、このプログラムを初めて実行し、エミュレーターで呼び出しを行うと、レコードが正常に追加され、リストビューに表示されます。しかし、別の呼び出しを行うと、最新のレコードが 2 回挿入され、同様にリストビューに最新のレコードが 2 回、古いレコードが 1 回表示されます。
どこが間違っているのか教えてください。本当に早急に済ませる必要があります。ありがとう!
package com.callloglist;
import static com.callloglist.Constants.KEY_ContactName;
import static com.callloglist.Constants.KEY_ContactNum;
import static com.callloglist.Constants.KEY_CurrTime;
import static com.callloglist.Constants.KEY_Date;
import static com.callloglist.Constants.KEY_Duration;
import static com.callloglist.Constants.KEY_NumType;
import static com.callloglist.Constants.TABLE_NAME;
import java.text.SimpleDateFormat;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
public class MainActivity extends Activity {
private Helper helper = new Helper(this);
private SimpleCursorAdapter dataAdapter;
private ListView listview;
SQLiteDatabase db;
@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()));
Button Btn = (Button) findViewById(R.id.button1);
Btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
SQLiteDatabase db = helper.getReadableDatabase();
Cursor c = db.query(TABLE_NAME, null, null, null, null, null, KEY_Date + " DESC");
final String[] columns = new String[]{KEY_ContactName,KEY_Date,KEY_Duration,};
final int[] to = new int[]{R.id.textView1,R.id.textView2,R.id.textView3};
dataAdapter= new SimpleCursorAdapter(getApplicationContext(), R.layout.log_layout, c, columns, to);
listview = (ListView) findViewById(R.id.list_view1);
// Assign adapter to ListView11
listview.setAdapter(dataAdapter);
}
});
}
public void addLog() {
db = helper.getWritableDatabase();
Cursor cursor = getContentResolver().query(
android.provider.CallLog.Calls.CONTENT_URI, null, null, null,
android.provider.CallLog.Calls.DATE + " DESC ");
cursor.moveToFirst();
// TODO Auto-generated method stub
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;
String contactNumber = cursor.getString(numberColumnId);
String contactName = cursor.getString(contactNameId);
String duration = cursor.getString(durationId);
String callDate = cursor.getString(dateId);
SimpleDateFormat formatter = new SimpleDateFormat(
"dd-MMM-yyyy HH:mm");
String dateString = formatter.format(new Date(Long
.parseLong(callDate)));
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, dateString);
values.put(KEY_CurrTime, currTime);
db.insert(TABLE_NAME, null, values);
cursor.close();
db.close();
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();
}
}
}