Android - узнайте, воспроизводится ли звук в данный момент, и остановите его - PullRequest
8 голосов
/ 22 мая 2009

Я использую экземпляр MediaPlayer для потоковой передачи аудиофайлов из Интернета. Аудиоплеер находится в отдельном действии. Пользователь может выбрать из списка аудиофайлов и перейти к этому занятию для воспроизведения звука.

Теперь пользователь может вернуться к предыдущему действию (со списком) и выбрать другой аудиофайл. В этом случае я хочу остановить воспроизведение любого другого звука и начать воспроизведение нового выбранного звука.

Могу ли я узнать, воспроизводится ли аудиофайл без необходимости удерживать объект MediaPlayer?

Спасибо.

Редактировать

Я узнал, как узнать, воспроизводится ли звук. Мы можем сделать это, используя объект AudioManager и вызывая isAudioPlaying (). Это вернет истину, если какой-либо звук воспроизводится.

Теперь другой вопрос, как остановить воспроизведение звука в данный момент? У меня нет экземпляра объекта MediaPlayer, который был создан для запуска звука (поскольку пользователь уже однажды покинул действие и вернулся с новым объектом действия и, таким образом, с новым экземпляром MediaPlayer)

Ответы [ 5 ]

10 голосов
/ 24 мая 2009

Вам нужно будет позвонить stop() в MediaPlayer экземпляре. Чтобы это работало в вашем приложении, вам нужно:

  • Звоните stop() в рамках действия воспроизведения звука (в onDestroy()), например
  • Создание Сервиса для воспроизведения аудио и связи с ним из обоих видов деятельности

Использование Service позволит вашему коду продолжить работу вне жизненного цикла Activity, и это единственный способ сохранить объект MediaPlayer, как вам нужно в этом случае.

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

2 голосов
/ 19 февраля 2014

Я нашел способ проверить, занят ли аудиопоток (AudioManager.STREAM_RING, AudioManager.STREAM_NOTIFICATION и т. Д.) В данный момент с помощью отражения:

/**
 * Unhide android api: check is stream is active now (AudioManager.STREAM_RING, AudioManager.STREAM_NOTIFICATION...),
 * uses reflection
 * @param audioStream
 * @return
 */
public static boolean isStreamActive(int audioStream) {
    Class<?> audioSystemClazz = null;
    Boolean res = false;
    try {
        audioSystemClazz = Class.forName("android.media.AudioSystem");
        if (null != audioSystemClazz) {
            // isStreamActive
            Method method = audioSystemClazz.getDeclaredMethod("isStreamActive", new Class<?>[] { int.class,
                    int.class });
            if (null != method) {
                res = (Boolean) method.invoke(null, audioStream, 0);
            }
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }

    return res;
}
2 голосов
/ 22 декабря 2009

@ lostintransit "Было бы лучше использовать сервис, статическую переменную или одноэлементный класс? Какой вариант дизайна лучше?"

Я думаю, что сервис - это то, что вы хотите. Встроенный медиаплеер и приложение Pandora используют службу, чтобы гарантировать, что музыка не связана с жизненным циклом Activity.

Если я понимаю, почему вы используете одноэлементный или статический, я не думаю, что он достигнет того, что вы хотите. Синглтон / статика будет применяться только в рамках одного процесса в Linux. Если вы запустите действие, затем закроете его, а затем снова запустите, они будут выполняться в разных процессах.

2 голосов
/ 16 июня 2009

Вот некоторый удобный код для сна, пока не закончится воспроизведение звука:

   AudioManager manager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
   while(manager.isMusicActive())
    {
        Log.d("music", "music is active");
        try
        {
            Thread.sleep(500);
        }
        catch (InterruptedException e)
        {
            Log.e("music", "interrupted waiting for music to stop");
        }
        Log.d("music", "done playing music");
    }
1 голос
/ 07 мая 2012

Попробуйте это ...

if (mp1 != null && mp1.isPlaying()) {
               mp1.stop();
           }

Где mp1 это MediaPlayer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...