반응형
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 |