如何根据手机铃声音量设置Android MediaPlayer的音量?

4

如何根据铃声音量设置MediaPlayer的音量?

我尝试了以下方法,但并没有起作用:

        MediaPlayer player = MediaPlayer.create(MyActivity.this, R.raw.sound);
        AudioManager audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        int currentVolume = audio.getStreamVolume(AudioManager.RINGER_MODE_NORMAL);

        player.setVolume(currentVolume, currentVolume);

你实际上想做什么? - ianhanniballake
1
最初,我想使用NotificationManager来显示通知和声音,但仅在应用程序关闭时。当应用程序处于活动状态时,我只想使用声音,因此,我正在尝试使用MediaPlayer,并将其音量设置为与铃声音量相同。 - zamroni hamim
4个回答

9

不要调整音量,而应使用setAudioStreamType()来设置您要在哪个音频流上播放您的音频-这将自动使用所选流的音量。例如,如果您希望您的音频以与通知相同的音量播放,则可以使用AudioManager.STREAM_NOTIFICATION

mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

1
这正是我需要做的。我只需要像这个答案中所述添加一个方法:https://dev59.com/bGkw5IYBdhLWcg3wJXQh,然后它就可以工作了。谢谢。 - zamroni hamim
2
这似乎没有引起任何错误,但我再也听不到任何声音了(即使我的通知音量很高),查看文档后发现该方法在API级别21中已被弃用... - Michael
1
在尝试过程中发现,为了使音频属性正常工作,必须在 prepare 之前调用 setAudioAttributes。使用 MediaPlayer 的 create(Context context,int resid,AudioAttributes audioAttributes,int audioSessionId)来传递音频属性是正确的方法。 - Amit Jayant

1

Try it:

AudioManager audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int currentVolume = audio.getStreamVolume(AudioManager.STREAM_RING);

1
尝试在AudioManager.STREAM_NOTIFICATION或AudioManager.STREAM_RING上播放没有产生任何声音。我必须通过AudioManager.STREAM_MUSIC进行操作。使用ssuukk在Android:MediaPlayer setVolume function中的想法,我编写了以下代码,它有效:
AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
int volume_level1= am.getStreamVolume(AudioManager.STREAM_RING);
int maxVolume=am.getStreamMaxVolume(AudioManager.STREAM_RING);
final MediaPlayer mp1 = MediaPlayer.create(context, R.raw.notification_delivery);
mp1.setAudioStreamType(AudioManager.STREAM_MUSIC);
float log1=(float)(1-Math.log(maxVolume-volume_level1)/Math.log(maxVolume));
mp1.setVolume(log1,log1);

1
你可以尝试像下面这样:

 AudioAttributes audioAttributes = new AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN)
            .setLegacyStreamType(AudioManager.STREAM_RING)
            .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE).build();
    int s = audioManager.generateAudioSessionId();
    mediaPlayer = MediaPlayer.create(context, R.raw.default_ring,audioAttributes,s);
    mediaPlayer.setLooping(true);
    mediaPlayer.start();

您可以在 setLegacyStreamType() 中传递所需的流类型。如果您像上面那样操作,媒体播放器的音量将遵循传递到音频属性中的 setLegacyStreamType() 方法的流类型音量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接