2012-05-10 2 views
7

BroadcastReceiver를 사용하여 미디어 버튼 (헤드셋에서 '재생 버튼') 중 하나를 캡처하는 서비스를 작성했으며 Android 2.3.x (HTC Nexus One 또는 HTC Desire)Android에서 미디어 캡처 버튼> = 4.0 (2.3에서 작동)

Android 4.0.3 (Samsung Nexus S)에서 실행하려고하면 작동하지 않습니다. 내 응용 프로그램에 "android.intent.action.MEDIA_BUTTON"및 " 재생 "버튼은 정상적으로 작동합니다 : 음악을 멈추거나 시작합니다). 매니페스트의

내용 : 내가 제안 된 솔루션을 시도했습니다, 나는 행동과 실행을 추가했습니다 :이 안드로이드 4.0.3


편집 작업을 할 수있는 방법은

... 
<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <receiver android:name=".buttonreceiver.MediaButtonIntentReceiver" > 
     <intent-filter android:priority="10000" > 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     </intent-filter> 
    </receiver> 
... 

있는가 하지만 내 수신기는 여전히 의도를받지 못합니다. 코드로 수신자를 등록하는 것이 이상한 것은 작동하지 않습니다.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.about_and_activation_view); 

    Log.d("MR", "onCreate - " + getIntent().getAction()); 

    mReceiver = new MediaButtonIntentReceiver(); 
    registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_MEDIA_BUTTON)); 
} 

이제 완전히 혼란 스럽습니다.

+0

참고 또한 의도 우선 순위보다 큰 -1000 미만 1000 – William

답변

12

앱에 활동이 있고 해당 버튼을 누르기 전에 사용자가이 활동을 실행하는지 확인하십시오. 그때까지 <receiver>will not receive any broadcasts.


UPDATE

안드로이드 4.0에

이상에서는, 당신은 또한 이벤트를 수신하기 위해 registerMediaButtonEventReceiver() on AudioManager를 호출 할 필요가 나타납니다. 이 상태는 registerMediaButtonEventReceiver()으로 전화 할 때까지 또는 unregisterMediaButtonEventReceiver()에 전화 할 때까지 유지됩니다. 예를 들어

,이 같은 활동

public class MediaButtonActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(
                             this, 
                             MediaButtonReceiver.class)); 
    } 
} 

이 가능하게 매니페스트 등록 ACTION_MEDIA_BUTTON 이벤트를 얻을 MediaButtonReceiver을.

+0

나는 음성 인식을 실행하고 다른 intets를 보내는 서비스 만있어이어야합니다 : 너무 onResume() 이벤트에 유용 할 수 . 이것은 안드로이드 2.3.x에서 잘 작동합니다. 이 유일한 수정 프로그램이 있습니까? 액티비티를 실행하려면 활성 화면에 인 텐트를 받아야합니다. 이는 내게 받아 들일 수 없습니다 .. –

+0

@MarekR : "가능한 유일한 해결책입니까?" - 그래, 네가 그 문제를 이해하지 못했을 거라 생각해. 그들은 활동을 떠나지 않아도됩니다. 사용자는 한 번 수동으로 활동을 시작해야 앱을이 중지 상태에서 벗어나게됩니다. 제 답변에서 링크 된 블로그 게시물을 읽어보십시오. – CommonsWare

+0

작동하지 않았습니다. Activity를 추가하고 실행했지만 여전히 "android.intent.action"을 캡처 할 수 없습니다. –

2

앱을 기본값으로 설정하고 버튼 누르기로 아무 것도 할 필요가없는 경우 다음 방법을 사용할 수 있습니다.

는 ("응용 프로그램"노드) 매니페스트 파일이 추가 :

<receiver android:name="BroadcastReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     </intent-filter> 
</receiver> 

의 주요 활동에서 onCreate()이 추가 또는 어디서나 앱이 실행될 때를 호출합니다.

mAudioManager = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE); 
    mRemoteControlResponder = new ComponentName(getActivity().getPackageName(), BroadcastReceiver.class.getCanonicalName()); 

    mAudioManager.registerMediaButtonEventReceiver(mRemoteControlResponder); 
관련 문제