Вопрос по android – Кнопка захвата мультимедиа на Android> = 4.0 (работает на 2.3)

9

Я написал какой-то сервис, который использует BroadcastReceiver для захвата одной из мультимедийных кнопок («кнопка воспроизведения» с гарнитуры), и он отлично работает на Android 2.3.x (HTC Nexus One или HTC Desire)

Когда я пытался запустить на Android 4.0.3 (Samsung Nexus S), он не работал (мое приложение не получает намерений "android.intent.action.MEDIA_BUTTON" и кнопка "играть" работает как обычно: останавливается / начинает музыку).

Содержание манифеста:

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

Есть ли способ заставить его работать на Android 4.0.3


изменить: я пробовал предлагаемое решение, я добавил действие и запустил его, но мой получатель по-прежнему не получает намерения. Что еще более странно, регистрация получателя по коду также не работает:

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

Теперь я в полном замешательстве.

Также обратите внимание, что приоритет намерения должен быть больше -1000 и меньше 1000. William

Ваш Ответ

2   ответа
2

Если вы просто хотите, чтобы ваше приложение использовалось по умолчанию, но вам не нужно ничего делать с нажатиями кнопок, вы можете использовать следующий метод.

Добавьте это в файл манифеста (в узле «Приложение»):

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

Добавьте это к onCreate () в основном действии или в любое другое место, которое вызывается при запуске приложения. Также может быть полезно в событии onResume ():

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

    mAudioManager.registerMediaButtonEventReceiver(mRemoteControlResponder);
12

Убедитесь, что в вашем приложении есть действие, и что пользователь запускает это действие, прежде чем пытаться нажать эту кнопку. До тех пор, ваш<receiver> не будет получать никаких трансляций.


UPDATE

На Android 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));
  }
}

включит манифест-зарегистрированMediaButtonReceiver чтобы получить события ACTION_MEDIA_BUTTON.

@MarekR: ОК, я нашел проблему - смотрите обновленный ответ.
@MarekR: & quot; это единственно возможное исправление? & Quot; - да, хотя я подозреваю, что вы не поняли, исправить. Они не должны оставлять деятельность запущенной. Им просто нужно один раз вручную запустить ваше действие, чтобы вывести ваше приложение из этого остановленного состояния. Пожалуйста, прочитайте ссылку на блог в моем ответе.
Это не сработало. Я имею в виду, что я добавил Activity и запустил ее, но все еще не могу перехватить android.intent.action.MEDIA_BUTTON & quot; даже когда Activity работает, мой получатель действительно получил это намерение. Marek R
Я получил только услугу, которая запускает распознавание речи и отправляет некоторые другие данные. Это хорошо работает на Android 2.3.x. Это единственное возможное исправление? Активное выполнение требует активного экрана для получения намерений, и это не приемлемо для меня .. Marek R
Спасибо, наконец, более или менее это работает. Marek R

Похожие вопросы