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