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에서 해제하는 것이 일반적인 패턴이다.