전화 상태 받는 부분을 테스트하면서 작성된 코드이다.
1. AndroidManifest.xml
(1) 퍼미션 설정
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
(2) 리시버 선언
<application .. >
...
<receiver
android:name=".패키지명.CallCheckReceiver"
android:enabled="true"
android:exported="true"
android:label="CallCheckReceiver"
android:process=".cCallCheckReceiver">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
</application>
2. CallCheckReceiver.java
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;
/**
* 전화 상태 리시버
* @author 임성진
* @version 1.0.0
* @since 2018-04-05 오전 1:12
**/
public class CallCheckReceiver extends BroadcastReceiver {
private final static String TAG = "free_call";
private AudioManager audioManager;
// 전화번호
private static String phoneNumber = "";
// incoming 수신 플래그
private static boolean incomingFlag = false;
@Override
public void onReceive(final Context context, Intent intent) {
// TODO Auto-generated method stub
this.audioManager = (AudioManager) context
.getSystemService(Context.AUDIO_SERVICE);
if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){
// TODO 전화를 걸었을 떄이다. (안드로이드 낮은 버전에서는 여기로 들어온다)
this.incomingFlag = false;
this.phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
}
// 폰 상태 체크
processPhoneState(intent, context);
}
/**
* 폰 상태를 체크한다,
* @author 임성진
* @version 1.0.0
* @since 2018-04-05 오전 1:44
**/
private void processPhoneState(Intent intent, Context context){
TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
switch (tm.getCallState()) {
case TelephonyManager.CALL_STATE_RINGING:
// TODO 전화를 왔을때이다. (벨이 울릴때)
this.incomingFlag = true;
this.phoneNumber = intent.getStringExtra("incoming_number");
Toast.makeText(context, "벨이 울리고 있다. " + phoneNumber, Toast.LENGTH_SHORT).show();
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
if(this.incomingFlag){
// TODO 전화가 왔을때이다. (통화 시작)
} else {
// TODO 안드로이드 8.0 으로 테스트했을때는 ACTION_NEW_OUTGOING_CALL 거치지 않고, 이쪽으로 바로 온다.
this.phoneNumber = intent.getStringExtra("incoming_number");
}
if (this.incomingFlag) {
// TODO 전화가 왔고, 통화를 시작했을때 그에 맞는 프로세스를 실행한다.
Toast.makeText(context, "전화가 와서 받았음 " + phoneNumber, Toast.LENGTH_SHORT).show();
} else {
// TODO 전화를 했을때 그에 맞는 프로세스를 실행한다.
Toast.makeText(context, "전화 했음 " + phoneNumber, Toast.LENGTH_SHORT).show();
}
break;
case TelephonyManager.CALL_STATE_IDLE:
if(this.incomingFlag){
// TODO 전화가 왔을때이다. (전화를 끊었을 경우)
Toast.makeText(context, "전화가 왔고, 끊었음 " + phoneNumber, Toast.LENGTH_SHORT).show();
} else {
// TODO 전화를 걸었을 떄이다. (전화를 끊었을 경우)
Toast.makeText(context, "전화를 했고, 끊었음 " + phoneNumber, Toast.LENGTH_SHORT).show();
}
break;
}
}
}
'Programming > Android' 카테고리의 다른 글
[Google Place] 주소 자동완성 기능 구현하기(커스텀 뷰) (custom) (2) | 2018.06.01 |
---|---|
[Android] SurfaceView 그레이디언트(gradient) 이미지 깨짐 현상 (0) | 2018.04.26 |
Android 8.0(O) TYPE_SYSTEM_ALERT (0) | 2018.04.05 |
[Android]Google 광고 ID 가져오기 (0) | 2018.01.25 |
[에러]AAPT2 error: check logs for details (0) | 2017.11.21 |