Выпуск тома MediaPlayer - выпуск AudioStream - PullRequest
3 голосов
/ 20 марта 2012

Я пытаюсь предоставить собственный звуковой сигнал при получении сообщения в приложении. Этот звуковой сигнал должен соответствовать уровню громкости уведомлений основного телефона (не громкости звонка). Это означает, что если уведомление по телефону vol = 3/10, то интенсивность звукового сигнала должна быть 3/10. Я не могу этого достичь,

  AudioManager audioMan = (AudioManager) context
            .getSystemService(Context.AUDIO_SERVICE);
    int volume;

    if (mPlayer == null) {
        mPlayer = MediaPlayer.create(context, R.raw.mytone);
    }

    if (mPlayer.isPlaying()) {
        mPlayer.stop();
        mPlayer.release();
        mPlayer = MediaPlayer.create(context, R.raw.mytone);

    }

    volume = audioMan.getStreamVolume(AudioManager.STREAM_NOTIFICATION);

    mPlayer.setVolume(volume, volume);//this doesn't work for me, beep sound is taking media player volume by default.

    mPlayer.setOnErrorListener(new OnErrorListener() {
        @Override
        public boolean onError(MediaPlayer player, int what, int extra) {
            player.stop();
            player.reset();
            return true;
        }
    });

    if (mVibrator == null)
        mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

    mVibrator.cancel();

Не могли бы вы поделиться своими знаниями и дать мне указания. Спасибо.

1 Ответ

4 голосов
/ 21 марта 2012

Похоже, что вы воспроизводите звук в музыкальном потоке по ссылке AudioManager.STREAM_MUSIC.Изменение уровня громкости изменяет уровень всего, что воспроизводится в этом потоке.Вот почему воспроизведение музыки / мультимедиа «испорчено».

Если вы хотите использовать поток звонка (и настройку его громкости), вам следует вместо этого использовать AudioManager.STREAM_RING.Вы говорите, что пробовали это, но фрагмент кода, который вы дали, просто регулирует громкость - вы не показали, как вы создаете и настраиваете MediaPlayer, прежде чем попросить его воспроизвести ваш звук.

Вы должны выбрать соответствующий поток, когда настраиваете свой экземпляр MediaPlayer.Поскольку я успешно использовал разные потоки в описываемом вами сценарии, вот в чем ваша проблема.Чтобы выбрать аудиопоток, в котором воспроизводится ваш пользовательский звуковой сигнал, используйте setAudioStream в своем экземпляре MediaPlayer, например, так:

// Get a reference to the MP3 file to play
AssetFileDescriptor afd = getContext().getResources().openRawResourceFd(R.raw.my_mp3);

// Create the media player
MediaPlayer mediaPlayer = new MediaPlayer();

// Give it the MP3 you want played
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());

// Set the audio stream to play over
mediaPlayer.setAudioStreamType(AudioManager.STREAM_RING);

// Now play the sound
mediaPlayer.prepare();
mediaPlayer.start();

Рекомендуется предлагать пользователям возможность выбирать поток для себя.- в дополнение к потокам музыки и звонка есть потоки тревог и уведомлений, каждый с независимым уровнем громкости (есть и другие, но это основные).Ознакомьтесь с документацией по Android для AudioManager здесь .

...