【问题标题】:How to set android MediaPlayer volume according to ringtone volume?如何根据铃声音量设置 android MediaPlayer 音量?
【发布时间】:2016-01-16 05:44:14
【问题描述】:

如何根据铃声音量设置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);

【问题讨论】:

  • 你到底想做什么?
  • 最初,我想使用 NotificationManager 来显示通知和声音,但仅在应用程序关闭时。当应用程序处于活动状态时,我只想使用声音,因此,我尝试使用与铃声音量相同的 MediaPlayer。

标签: android android-mediaplayer ringtone


【解决方案1】:

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

mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

【讨论】:

  • 这正是我需要做的。我只需要在答案中添加一个方法:stackoverflow.com/questions/10097954/…,它就可以工作。谢谢。
  • 这似乎不会导致任何错误,但我不再听到任何声音(即使我的通知音量已经提高),并且查看文档说此方法在 API 级别 21 中已弃用...
  • 折腾后发现为了让音频属性正常工作,必须在prepare前调用setAudioAttributes。使用 MediaPlayer 的 create(Context context, int resid, AudioAttributes audioAttributes, int audioSessionId) 来传递音频属性是要走的路。
【解决方案2】:

试试看:

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

【讨论】:

    【解决方案3】:

    尝试在 AudioManager.STREAM_NOTIFICATION 或 AudioManager.STREAM_RING 上播放没有产生任何声音。我必须通过 AudioManager.STREAM_MUSIC。使用Android: MediaPlayer setVolume function ssuukk 的想法,我编写了以下有效的代码:

    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);
    

    【讨论】:

      【解决方案4】:

      您可以尝试如下:

       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() 方法的流类型音量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多