반응형
BroadcastReceiver 를 이용하면 수신 전화를 모니터링할 수 있습니다. 이것은 네이버나 구글이나 어디서 검색하든지 쉽게 얻을 수 있는 정보 입니다.
하지만 발신 정보를 얻기란 정말 힘듭니다. 전화 상태로 발신을 구분을 할수 있습니다.
발신 : IDLE -> OFFHOOK -> IDLE
수신 : IDLE -> RINGING -> OFFHOOK -> IDLE
하지만 수신 번호가 아닌 발신 번호는 알 수 없습니다.
그래서 몇일 동안 검색을 통해 알아내었습니다.
AndroidManifest.xml
Log
public class Log { private long id; private String number; private LogKind kind; public Log(String number, LogKind kind){ this.number = number; this.kind = kind; } public void setId(long id) { this.id = id; } public long getId() { return id; } public String getNumber() { return number; } public LogKind getKind() { return kind; } protected String getTimeString(long time){ return DateFormat.format("yyyy-mm-dd hh:mm:ss",time).toString(); } }
CallLog
public class CallLog extends Log { private String ringingDate; private String startDate; private String endDate; public CallLog(String number, LogKind kind){ super(number, kind); } public void setRingingDate(long time) { this.ringingDate = getTimeString(time); } public void setStartDate(long time) { this.startDate = getTimeString(time); } public void setEndDate(long time) { this.endDate = getTimeString(time); } public String getRingingDate() { return ringingDate; } public String getStartDate() { return startDate; } public String getEndDate() { return endDate; } public String toString(){ StringBuilder buffer = new StringBuilder(); buffer.append(getKind()).append(" / ") .append(getNumber()).append(" / ") .append(getId()).append(" / ") .append(getRingingDate()).append(" / ") .append(getStartDate()).append(" / ") .append(getEndDate()); return buffer.toString(); } }
PhoneStateReceiver
public class PhoneStateReceiver extends BroadcastReceiver { private static int pState = TelephonyManager.CALL_STATE_IDLE; private static CallLog cLog; 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){ Log.i("Phone","IDLE"); if(cLog != null){ cLog.setEndDate(System.currentTimeMillis()); Log.i("Phone",cLog.toString()); cLog = null; } } else if(state == TelephonyManager.CALL_STATE_RINGING){ Log.i("Phone","RINGING"); cLog = new CallLog(incomingNumber, LogKind.KIND_RECEIVE); cLog.setRingingDate(System.currentTimeMillis()); } else if(state == TelephonyManager.CALL_STATE_OFFHOOK){ Log.i("Phone","OFFHOOK"); cLog.setStartDate(System.currentTimeMillis()); } pState = state; } } }, PhoneStateListener.LISTEN_CALL_STATE); if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){ Log.i("Phone","out"); cLog = new CallLog(intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER), LogKind.KIND_SEND); cLog.setRingingDate(System.currentTimeMillis()); } } }
Logcat Log
발신시
수신시
제가 쓰려고 만들어 보았습니다. 허접하지만 이해하시는데 문제 없을거에요~ ^^
반응형
'Programming > Android' 카테고리의 다른 글
컨텍스트 메뉴에 타이틀 넣기 (4) | 2011.01.09 |
---|---|
안드로이드 메모리 (0) | 2010.10.29 |
Activity 타이틀바에 프로그래스바 (0) | 2010.07.14 |
버전이름 가져오기 (0) | 2010.07.14 |
가로화면, 세로화면 전환시 문제점 (1) | 2010.07.14 |