티스토리 뷰
(BroadcastReceiver)브로드 캐스트 리시버는 메니페스트에 한번 등록해놓으면, 앱이 실행되는 동안, 브로드 캐스트가 들어올 때 한번씩 실행해준다.
우선 1단계 manifests 에 Callrecevier를 등록해준다.
<receiver android:name=".CallReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
<action android:name="android.intent.action.BATTERY_LOW"/>
</intent-filter>
</receiver>
여기서 android.intent.action.BATTERY_LOW는 배터리가 없을 때의 상태도 받기위해 추가하였다. 전화만 사용할거면 없어도 된다.
2단계 CallReceiver.java 를 만든다.
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.telecom.TelecomManager;
import android.telephony.TelephonyManager;
import android.util.Log;
import androidx.annotation.RequiresApi;
//전화 중이면 전화를 받고 아니면 메세지
public class CallReceiver extends BroadcastReceiver {//현재 전화가 오는지 받는지 끊는지 기본인지
String phonestate;
@RequiresApi(api = Build.VERSION_CODES.O)
@SuppressLint("MissingPermission")
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.PHONE_STATE")) {
TelecomManager telephonyManager = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
Bundle extras = intent.getExtras();
if (extras != null) {
String state = extras.getString(TelephonyManager.EXTRA_STATE); // 현재 폰 상태 가져옴
if (state.equals(phonestate)) {
return;
} else {
phonestate = state;
}
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
String phoneNo = extras.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.d("qqq", phoneNo + "currentNumber");
Log.d("qqq", "통화벨 울리는중");
// telephonyManager.acceptRingingCall(); 전화 받기 함수이다.
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// telephonyManager.endCall(); 전화 끊기, 거절 함수이다.
// }
} else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
Log.d("qqq", "통화중");
} else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
Log.d("qqq", "통화종료 혹은 통화벨 종료");
}
Log.d("qqq", "phone state : " + state);
Log.d("qqq", "phone currentPhonestate : " + currentPhoneState);
}
}
}
}
//TelephonyManager.EXTRA_STATE_IDLE: 통화종료 혹은 통화벨 종료
//
// TelephonyManager.EXTRA_STATE_RINGING: 통화벨 울리는중
//
// TelephonyManager.EXTRA_STATE_OFFHOOK: 통화중
이렇게하면 앱이 전화 수신 상태를 감지할 수 있고, 수신상태에 따라 전화를 받거나, 거절하게 설정할 수 있다.
//TelephonyManager.EXTRA_STATE_IDLE: 통화종료 혹은 통화벨 종료
//
// TelephonyManager.EXTRA_STATE_RINGING: 통화벨 울리는중
//
// TelephonyManager.EXTRA_STATE_OFFHOOK: 통화중
통화종료 혹은 통화벨 종료, 대기상태일때는 IDLE
전화가 오는 벨소리가 울리는 상태에서는 RINGING
통화중일때는 OFFHOOK
위 값이 state에 들어가게 된다.
이걸보고 자신이 원하는 동작을 수행하면 된다.
통화 받아주는 함수는 : telephonyManager.acceptRingingCall();
통화 거절 혹은 통화 종료 함수는 :
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// telephonyManager.endCall(); 전화 끊기, 거절 함수이다.
// }
버전 29에서 확인 완료하였다. 그 전버전에서는 안되도록 되었다가 다시 되게 만들어 졌다고 알고있다.
'Web&App > 안드로이드' 카테고리의 다른 글
안드로이드 터치 막기 (0) | 2020.03.19 |
---|---|
안드로이드 배터리 상태 확인하기 broadcastreceiver 사용 BATTERY_LOW (0) | 2020.03.18 |
안드로이드 볼륨 조절하기 (원하는 볼륨값으로 세팅하기) (2) | 2020.03.17 |
exo player 기본 이미지 넣기 - Glide 사용 (artwork 삽입) (0) | 2020.03.17 |
안드로이드 사진 배경 투명하게 만들기 png와 jpg 차이 (0) | 2020.03.13 |