마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 서비스에서 이어폰 연결 유무 확인 관련하여 질문드립니다.

0 추천

class myServiceHandler extends Handler {

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)

    @Override

    public void handleMessage(android.os.Message msg) {

        Intent intent = new Intent(MyService.this, MainActivity.class);

        PendingIntent pendingIntent = PendingIntent.getActivity(MyService.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        Notifi = new Notification.Builder(getApplicationContext())

                .setContentIntent(pendingIntent)

                .build();

        mBroadcastReceiver = new BroadcastReceiver() {

            @Override

            public void onReceive(Context context, Intent intent) {

                AudioManager audio = (AudioManager) getSystemService(MyService.this.AUDIO_SERVICE);

                boolean isEarphoneOn = (intent.getIntExtra("state", 0) > 0) ? true : false;

                if (isEarphoneOn) {

Log.e("ear",String.valueOf(isEarphone);

               } else {

Log.e("ear",String.valueOf(isEarphone);

                }

            }

        };

        registerReceiver(mBroadcastReceiver, mIntentFilter);

    }

}

 

위와 같이 MyServiceHandler를 만들어서 이어폰의 연결 유무를 서비스에서 확인하고 있는데요

문제가 되는게

이어폰을 연결하고 빠르게 제거하게 되면 그대로 연결이 되어 있다고 인식하더라고요

그리고 다시 이어폰을 꽃으면 그떄 연결해제로 인식하게 되는데요

이 핸들러는 onStartCommand(Intent intent, int flags, int startId) 이부분에 넣어서 사용하고 있습니다.

일단 BroadCast를 이용하고 있는거라 동작의 변화가 있으면 하는부분인데 불리는 부분인데...

왜 인식 관련되서 가끔씩 오류가 생기는지 의문이어서요

 

onStartCommand에서 부르는게 잘못 된걸까요???

익명사용자 님이 2017년 11월 2일 질문

1개의 답변

0 추천
오디오 매니저에 isWiredHeadsetOn() 메쏘드가 있네요.

https://stackoverflow.com/questions/16395054/check-whether-headphones-are-plugged-in
Will Kim (43,170 포인트) 님이 2017년 11월 3일 답변
이 메소드를 안쓴게 문제인가요?

일단 연결유무확인은 됬는데
가끔씩 문제가 생겨서 질문한 것입니다.
제가 본 몇개 샘플에서는 state 값은 integer입니다. boolean으로 매칭하면 바로 매칭이 안됩니다. state 값을 integer로 받아서 출력해 보세요.

This is the part of "HeadsetObserver.java", Android SDK Source.

private final void sendIntent(int headset, int headsetState, int prevHeadsetState, String headsetName) {
    if ((headsetState & headset) != (prevHeadsetState & headset)) {
        //  Pack up the values and broadcast them to everyone
        Intent intent = new Intent(Intent.ACTION_HEADSET_PLUG);

        **intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);**

        int state = 0;
        int microphone = 0;

        if ((headset & HEADSETS_WITH_MIC) != 0) {
            microphone = 1;
        }
        if ((headsetState & headset) != 0) {
            state = 1;
        }
        intent.putExtra("state", state);
        intent.putExtra("name", headsetName);
        intent.putExtra("microphone", microphone);

        if (LOG) Slog.v(TAG, "Intent.ACTION_HEADSET_PLUG: state: "+state+" name: "+headsetName+" mic: "+microphone);
        // TODO: Should we require a permission?
        ActivityManagerNative.broadcastStickyIntent(intent, null);
    }
}
...