Принять отключение наушников занимает слишком много времени

Я хочу приостановить MediaPlayer, когда пользователь отключает наушники. Я узнал, что я могу использовать "ACTION_AUDIO_BECOMING_NOISY" трансляцию, так что я попробовал!

Теоретически это работает, НО время получения занимает слишком много времени. Музыка все еще играет в течение 3-5 секунд, прежде чем она действительно останавливается. Это было бы неприемлемо для пользователя.

Как другие разработчики могут приостановить его в миллисекундах? Есть ли лучшие решения?

Мой BroadcastReceiver, который на самом деле для уведомлений:

public class NotificationBroadcast extends BroadcastReceiver {

...

@Override
public void onReceive(Context context, Intent intent) {

    if (intent.getAction().equals(android.media.AudioManager.ACTION_AUDIO_BECOMING_NOISY)) {

        Intent iPause = new Intent(context , SongService.class);
        iPause.putExtra("com.Hohos.mplay.Services.SongService.MEDIA_ACTION", NOTIFY_EXTRA_PAUSE);
        context.startService(iPause);
    }

...
}

Я также добавил <uses-permission android:name="android.permission.ACTION_HEADSET_PLUG"/>, который действительно не имеет никакого значения

Спасибо за помощь ребята!

1 ответ

Решение

Чтобы узнать, когда пользователь отключает наушники, необходимо прослушать действие ACTION_HEADSET_PLUG и проверить state дополнительно:

Broadcast Action: Проводная гарнитура подключена или отключена.

Намерение будет иметь следующие дополнительные значения:

  • состояние - 0 для отключенного, 1 для подключенного.
  • name - тип гарнитуры, удобочитаемая строка
  • микрофон - 1, если в гарнитуре есть микрофон, 0 в противном случае

Это пример:

public class MainActivity extends Activity {

    private HeadsetBroadcastReceiver mHeadsetBroadcastReceiver;

    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myReceiver = new HeadsetBroadcastReceiver();
    }

    @Override 
    protected void onResume() {
        IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
        registerReceiver(mHeadsetBroadcastReceiver, filter);
        super.onResume();
    }

    @Override 
    protected void onPause() {
        unregisterReceiver(mHeadsetBroadcastReceiver);
        super.onPause();
    }

    private class HeadsetBroadcastReceiver extends BroadcastReceiver {
        @Override 
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
                int state = intent.getIntExtra("state", -1);

                if (state == 0) {
                    //Headset is unplugged
                } else if(state == 1) {
                    //Headset is plugged
                }
            }
        }
    }
}
Другие вопросы по тегам