부름의 컨텐츠 제공자가 변경되었는지를 알 수있는 방법이 있는지 알고 싶습니다. 내 전화를 걸거나 전화를 받으면 통화 기록에 새 로그가 추가 된 '깃발'을 반환하거나 안드로이드가 통화 정보를 저장하는 장소를 반환합니다.통화 기록을위한 ContentObserver 구현 방법
전화를 걸면 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<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();
}
});
}
}
들의 OnDestroy() 메소드에서 공급자의 등록을 취소하는 것을 잊지 마세요. – moonlightcheese
그렇지 않으면 어떻게됩니까? 나는 관찰자 등록을 취소하기 위해 그것을 기억하지 않으면 안된다고 생각합니다. –
줄에 새 RatedCallsContentObserver (처리기)); 핸들러는 어디서 온/왜 필요합니까? 감사! –