Android에서 헤드셋 연결 및 해제 감지하기

Android 플랫폼에서 헤드셋의 연결 및 해제 상태를 감지하려면 BroadcastReceiver를 활용하여 "android.intent.action.HEADSET_PLUG" 인텐트를 모니터링하면 된다. 이 인텐트는 시스템에서 헤드셋 상태가 변경될 때 자동으로 전송된다.

해당 인텐트에는 다음 정보가 포함되어 있다:

  • state - 0은 해제 상태, 1은 연결 상태를 의미
  • name - 헤드셋 종류를 나타내는 문자열
  • microphone - 1은 마이크가 포함된 헤드셋, 0은 마이크가 없는 헤드셋

AndroidManifest.xml 파일에 정적으로 리시버를 등록하는 방식은 동작하지 않는다. 따라서 코드에서 동적으로 리시버를 등록해야 한다.

import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;

public class HeadsetActivity extends Activity {
    private HeadsetStateReceiver receiver;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initializeReceiver();
    }
    
    private void initializeReceiver() {
        receiver = new HeadsetStateReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.intent.action.HEADSET_PLUG");
        registerReceiver(receiver, filter);
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        releaseReceiver();
    }
    
    private void releaseReceiver() {
        if (receiver != null) {
            unregisterReceiver(receiver);
        }
    }
}

리시버 클래스에서는 인텐트의 부가 데이터를 확인하여 헤드셋 상태를 파악할 수 있다:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class HeadsetStateReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent == null) return;
        
        if (intent.hasExtra("state")) {
            int state = intent.getIntExtra("state", 0);
            
            if (state == 0) {
                Toast.makeText(context, "헤드셋이 연결 해제되었습니다", Toast.LENGTH_LONG).show();
            } else if (state == 1) {
                Toast.makeText(context, "헤드셋이 연결되었습니다", Toast.LENGTH_LONG).show();
            }
        }
    }
}

동적 등록 방식을 사용하면 Activity的生命周期에 맞춰 리시버를 활성화하거나 비활성화할 수 있어 메모리 관리 측면에서도 효과적이다. onCreate에서 등록하고 onDestroy에서 해제하는 것이 일반적인 패턴이다.

태그: Android broadcastreceiver Intent headset-detection android-development

6월 6일 18:11에 게시됨