2012-05-10 20 views
7

Napisałem usługę, która wykorzystuje BroadcastReceiver do przechwytywania jednego z przycisków multimedialnych ("przycisk odtwarzania" z zestawu słuchawkowego) i działa doskonale na Android 2.3.x (HTC Nexus One lub HTC Desire)Przycisk przechwytywania multimediów w systemie Android> = 4.0 (działa w trybie 2.3)

Gdy próbowałem uruchomić Androida 4.0.3 (Samsung Nexus S), nie działa (moja aplikacja nie otrzymuje zamiaru "android.intent.action.MEDIA_BUTTON" i " przycisk odtwarzania "zachowuje się jak zwykle: zatrzymuje/uruchamia muzykę).

Treść manifestu:

... 
<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> 
... 

Czy istnieje sposób, aby to działało na Androidzie 4.0.3


edit: mam spróbuj proponowane rozwiązanie, Dodałem działania i przebieg to, ale mój odbiornik nadal nie otrzymuje intencji. Co dziwniejsze, rejestrowanie odbiornika za pomocą kodu również nie działa:

@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)); 
} 

Teraz jestem całkowicie zdezorientowany.

+0

Należy również zauważyć, że zamiar priorytetem musi być większa niż -1000 i mniej niż 1000. – William

Odpowiedz

12

Upewnij się, że masz aktywność w aplikacji i że użytkownik uruchamia tę czynność przed próbą naciśnięcia tego przycisku. Do tego czasu Twój <receiver>will not receive any broadcasts. Wydaje


UPDATE

Na Android 4.0 i wyżej, że trzeba także zadzwonić registerMediaButtonEventReceiver() on AudioManager w celu odbierania zdarzeń. Ten stan będzie obowiązywać, dopóki coś innego nie zadzwoni pod numer registerMediaButtonEventReceiver() lub dopóki nie zadzwonisz pod numer unregisterMediaButtonEventReceiver().

Na przykład, aktywność tak:

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)); 
    } 
} 

pozwoli oczywisty zarejestrowanych MediaButtonReceiver dostać wydarzenia ACTION_MEDIA_BUTTON.

+0

Mam tylko usługę, która działa rozpoznawanie mowy i wysyła jakieś inne intets . Działa to ładnie na systemie Android 2.3.x. Czy to tylko możliwa poprawka? Uruchamianie aktywności wymaga aktywnego ekranu, aby otrzymywać zamiary, a to jest dla mnie nie do przyjęcia. –

+0

@MarekR: "Czy to tylko możliwa poprawka?" - tak, choć podejrzewam, że nie rozumiesz poprawki. Nie muszą opuszczać uruchomionej działalności. Po prostu muszą ręcznie uruchomić swoją działalność, aby przenieść aplikację z tego stanu zatrzymania. Proszę przeczytać link do wpisu na blogu w mojej odpowiedzi. – CommonsWare

+0

To nie działa. Mam na myśli, że dodałem Aktywność i uruchomiłem ją, ale nadal nie mogę uchwycić "android.intent.action".MEDIA_BUTTON ", nawet gdy Aktywność jest aktywowana, mój odbiorca robi to z zamiarem. –

2

Jeśli chcesz, aby Twoja aplikacja była domyślna, ale nie musisz nic robić za pomocą przycisków, możesz użyć poniższej metody.

Dodaj do tego pliku manifestu (w węźle „Aplikacja”):

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

Dodaj to do onCreate() w głównej działalności lub gdziekolwiek chcesz, która jest wywoływana, gdy aplikacja zostanie uruchomiona. Może być przydatna w onResume() imprezy TOO:

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

    mAudioManager.registerMediaButtonEventReceiver(mRemoteControlResponder); 
Powiązane problemy