본문 바로가기
IT/Android

안드로이드에서 전화 수신 시 통화 받기 및 스피커폰 전환하기

by bamcong 2025. 4. 5.
728x90
반응형

이번 포스팅에서는 Android에서 전화가 올 때, 해당 전화를 수신하고 스피커폰으로 전환하는 예제 소스코드를 소개하겠습니다. 그러나 안드로이드 10 이상부터는 통화를 수신하는 방식이 변경되어 이러한 작업이 어떻게 제한되는지에 대해서도 설명드리겠습니다.

안드로이드 15

1. 전화 수신 시 통화 받기

먼저, 전화 수신 시 호출되는 BroadcastReceiver를 구현하여 수신된 전화를 감지하겠습니다. 아래의 코드는 전화가 수신될 때 작업을 수행하기 위한 예제입니다.

public class CallReceiver extends BroadcastReceiver {
    private static final String TAG = "CallReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) {
            String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
            Log.d(TAG, "수신 전화: " + incomingNumber);
            
            // 전화가 오는 중일 때 자동으로 전화 받기
            answerCall(context);
        }
    }

    private void answerCall(Context context) {
        // Android 버전에 따라 다른 방식으로 처리
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // Android 8.0 이상에서는 TelecomManager 사용
            TelecomManager telecomManager = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
            
            if (telecomManager != null) {
                if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ANSWER_PHONE_CALLS) 
                        == PackageManager.PERMISSION_GRANTED) {
                    try {
                        telecomManager.acceptRingingCall();
                        Log.d(TAG, "전화를 자동으로 받았습니다.");
                    } catch (Exception e) {
                        Log.e(TAG, "전화를 받는 데 실패했습니다: " + e.getMessage());
                    }
                } else {
                    Log.e(TAG, "ANSWER_PHONE_CALLS 권한이 없습니다.");
                }
            }
        } else {
            // Android 8.0 미만에서는 다른 방식으로 처리 (주의: 이 방식은 모든 기기에서 작동하지 않을 수 있음)
            try {
                Intent buttonDown = new Intent(Intent.ACTION_MEDIA_BUTTON);
                buttonDown.putExtra(Intent.EXTRA_KEY_EVENT, new android.view.KeyEvent(
                        android.view.KeyEvent.ACTION_DOWN, android.view.KeyEvent.KEYCODE_HEADSETHOOK));
                context.sendOrderedBroadcast(buttonDown, null);

                Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);
                buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, new android.view.KeyEvent(
                        android.view.KeyEvent.ACTION_UP, android.view.KeyEvent.KEYCODE_HEADSETHOOK));
                context.sendOrderedBroadcast(buttonUp, null);
                
                Log.d(TAG, "전화를 자동으로 받았습니다.");
            } catch (Exception e) {
                Log.e(TAG, "전화를 받는 데 실패했습니다: " + e.getMessage());
            }
        }
    }
}

위의 코드는 전화 수신 상태를 감지하는 기본적인 코드입니다. 이제 이 상태에서 사용자가 전화 통화를 수신하도록 승인하는 과정이 필요합니다.

2. 통화를 스피커폰으로 전환하기

통화를 수신하고 난 후 스피커폰으로 전환하려면 아래의 메소드를 사용할 수 있습니다.

import android.content.Context;
import android.media.AudioManager;

public void switchToSpeaker(Context context) {
    AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    audioManager.setMode(AudioManager.MODE_IN_CALL);
    audioManager.setSpeakerphoneOn(true);
}

통화를 받은 후, 위의 메서드를 호출하여 스피커폰으로 전환할 수 있습니다. 다음 단계에서는 AndroidManifest.xml에 권한을 추가하고, BroadcastReceiver를 등록해야 합니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.phoneapp">

        <!-- 전화 상태 읽기 권한 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <!-- Android 8.0 이상에서 전화 받기 위한 권한 -->
    <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />

    <!-- 전화 걸기 권한 (필요할 수 있음) -->
    <uses-permission android:name="android.permission.CALL_PHONE" />
    
    <application
        ... >
        <receiver android:name=".CallReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

3. Android 10 이상에서의 통화 수신 제한

안드로이드 10부터는 앱이 시스템의 통화 기능에 접근할 수 있는 방법이 제한되었습니다. 이는 사용자 개인정보 보호 및 보안 강화의 일환으로, 사용자가 명시적으로 승인을 하지 않는다면 전화 상태를 수신하거나 변경하는 것이 불가능하게 되었습니다.

“안드로이드 10 이상에서 이러한 통화 관련 권한을 요청하는 경우, Google Play의 가이드라인에 따라 얻은 권한을 사용해야 합니다.”

따라서 해당 기능을 구현하고자 할 때는 사용자에게 명확한 안내와 함께 승인을 요청하는 접근 방식이 필요합니다. 또한, 보안 문제로 인해 더욱 투명한 정책을 요구하는 추세입니다.

 

결론적으로, 안드로이드 10 이상의 버전을 대상으로 할 경우, 통화 기능에 접근하기 위한 별도의 승인이 필요하며, 이로 인해 일부 기능이 제한될 수 있습니다.

 

추가로, 자동으로 전화를 받는 기능은 대부분의 안드로이드 기기에서 제한될 수 있으며, 제조사나 Android 버전에 따라 작동하지 않을 수 있습니다.

 

이 포스팅이 유익하셨다면 '좋아요' 버튼을 눌러주세요!

728x90
반응형