Programming/Android2010.08.31 01:07

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

발신시


수신시


제가 쓰려고 만들어 보았습니다. 허접하지만 이해하시는데 문제 없을거에요~ ^^
Posted by 초프 초프(초보 프로그래머)

댓글을 달아 주세요

  1. 유령

    안녕하세요. 좋은자료 포스팅해주셔서 감사합니다. 궁금한게 있어서 이렇게 글을 남깁니다.
    로그 클래스에서 LogKind라는 데이터타입이 없다고 에러가 뜨는데
    LogKind는 어디에 나오는건지 알려주시면 감사하겠습니다.
    오늘도 좋은하루 되세요 ^ ^

    2011.08.08 19:42 [ ADDR : EDIT/ DEL : REPLY ]
  2. 비밀댓글입니다

    2012.10.25 09:11 [ ADDR : EDIT/ DEL : REPLY ]
  3. TheBlaXnoW

    좋은 지식 잘 얻어 갑니다. 포스트 링크 좀 담아갈게요~

    2013.03.19 01:34 [ ADDR : EDIT/ DEL : REPLY ]
  4. 이 것을 이용하면 주소록에 있는 저장 된 이름도 받아 올 수 있나요?

    2015.11.26 12:18 [ ADDR : EDIT/ DEL : REPLY ]