티스토리 뷰

 

(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에서 확인 완료하였다. 그 전버전에서는 안되도록 되었다가 다시 되게 만들어 졌다고 알고있다.

 

 

댓글
최근에 올라온 글
최근에 달린 댓글
250x250