안드로이드 수신/발신 정보 가져오기 CallLog 이용
- private void getHistory() {
- String[] projection = { CallLog.Calls.CONTENT_TYPE, CallLog.Calls.NUMBER, CallLog.Calls.DURATION, CallLog.Calls.DATE };
Cursor cur = managedQuery(CallLog.Calls.CONTENT_URI, null, CallLog.Calls.TYPE + "= ?",
new String[]{ String.valueOf(CallLog.Calls.OUTGOING_TYPE) }, CallLog.Calls.DEFAULT_SORT_ORDER);
Log.d("db count=", String.valueOf(cur.getCount()));
Log.d("db count=", CallLog.Calls.CONTENT_ITEM_TYPE);
Log.d("db count=", CallLog.Calls.CONTENT_TYPE);
if(cur.moveToFirst() && cur.getCount() > 0) {
while(cur.isAfterLast() == false) {
StringBuffer sb = new StringBuffer();
sb.append("call type=").append(cur.getString(cur.getColumnIndex(CallLog.Calls.TYPE)));
sb.append(", cashed name=").append(cur.getString(cur.getColumnIndex(CallLog.Calls.CACHED_NAME)));
sb.append(", content number=").append(cur.getString(cur.getColumnIndex(CallLog.Calls.NUMBER)));
sb.append(", duration=").append(cur.getString(cur.getColumnIndex(CallLog.Calls.DURATION)));
sb.append(", new=").append(cur.getString(cur.getColumnIndex(CallLog.Calls.NEW)));
sb.append(", date=").append(timeToString(cur.getLong(cur.getColumnIndex(CallLog.Calls.DATE)))).append("]");
cur.moveToNext();
Log.d("call history[", sb.toString());
}
} - }
- androidManifest.xml에 추가
- <uses-permission android:name="android.permission.READ_CONTACTS" />
아주 편리하게도 api가 있다. CallLog를 이용해서 DB 에 저장된 내용을 가져올 수 있다.
주석 없이도 볼 수 있을 거란 생각에 주석은 생략한다.
CallLog의 경우 사용자가 전화통화내역 삭제를 누를 경우 볼 수 없다.
그리하야 별도로 call log 를 쌓으려고 한다.
방법은 직접 action을 감지하고, 통화 내역을 계산하여 별도의 DB에 쌓는 것이다.
안드로이드 수신/발신 정보 모니터링 하기
- private String LOG_TAG = "CheckCall";
private static int pState = TelephonyManager.CALL_STATE_IDLE; -
- public void onReceive(Context context, final Intent intent) {
TelephonyManager telManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
telManager.listen(new PhoneStateListener(){
public void onCallStateChanged(int state, String incomingNumber){
if(state != pState){
if(state == TelephonyManager.CALL_STATE_IDLE){
Toast.makeText(mContext, "IDLE" + String.valueOf(System.currentTimeMillis()), Toast.LENGTH_SHORT).show();
}
else if(state == TelephonyManager.CALL_STATE_RINGING){
Toast.makeText(mContext, "RINGING" + String.valueOf(System.currentTimeMillis() +incomingNumber), Toast.LENGTH_SHORT).show();
}
else if(state == TelephonyManager.CALL_STATE_OFFHOOK){
Toast.makeText(mContext, "OFFHOOK" + String.valueOf(System.currentTimeMillis()), Toast.LENGTH_SHORT).show();
}
pState = state;
}
}
}, PhoneStateListener.LISTEN_CALL_STATE);
if(Intent.ACTION_NEW_OUTGOING_CALL.equals(intent.getAction())){
Log.i(LOG_TAG, "out=" + intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER));
}
} -
AndroidManifest.xml
<receiver android:name=class name>
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
-
- 참고자료
이정도 코드 역시 주석이 없이도 쉬이 할 수 있을 것 같아서 그냥 붙여 넣었다. 매니페스트에 권한과 인텐트 필터 넣는 것을 몰라 한참을 리서치 했다.
state
- 발신시
Intent.ACTION_NEW_OUTGOING_CALL -> offhook -> idle
- 수신시
Ring -> offhook -> idle
원문 :http://whdnfl21.springnote.com/pages/6833219