MediaPlayer卷问题 - AudioStream问题

时间:2012-03-19 20:41:56

标签: java android media-player

当我在我的应用程序中收到消息时,我正在尝试提供自定义的哔声。此哔声应尊重主电话通知音量级别(不是铃声音量)。这意味着如果手机通知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 个答案:

答案 0 :(得分:4)

看起来你正在通过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();

为用户提供为自己选择流的选项的良好做法 - 除了音乐和铃声流之外还有警报和通知流,每个都有独立的音量级别(还有其他音量级别,但这些是核心的)。请查看AudioManager here上的Android文档。