본문 바로가기

Programming/Android

안드로이드 발신, 수신 통화 모니터링하기

반응형

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

발신시


수신시


제가 쓰려고 만들어 보았습니다. 허접하지만 이해하시는데 문제 없을거에요~ ^^
반응형