【问题标题】:How to play a ringtone using the Alarm volume with setAudioAttributes?如何使用带有 setAudioAttributes 的闹钟音量播放铃声?
【发布时间】:2018-08-22 17:11:31
【问题描述】:

所以我正试图围绕音频属性展开思考。到目前为止,这是我所拥有的:

// alarm.getSound() will return a proper URI to pick a ringtone
Ringtone tone = RingtoneManager.getRingtone(this, alarm.getSound());
if (Build.VERSION.SDK_INT >= 21) {
    AudioAttributes aa = new AudioAttributes.Builder()
        .setFlags(AudioAttributes.USAGE_ALARM | AudioAttributes.CONTENT_TYPE_SONIFICATION)
        .build();
    tone.setAudioAttributes(aa);
} else {
    tone.setStreamType(RingtoneManager.TYPE_ALARM);
}
tone.play();

This page 谈论音频属性及其“兼容性映射”。如果我以前使用setStreamType(TYPE_ALARM)(就像我在上面一样),那么它将设置CONTENT_TYPE_SONIFICATIONUSAGE_ALARM 标志。我想远离setStreamType,所以我在想如果我手动设置这些标志(就像我在上面一样),那么当铃声播放时它将使用闹钟音量。好吧,它似乎不像那样工作。

上面的代码仍然使用我的 Nexus 6 的媒体音量而不是闹钟音量响铃。我正在使用构建 MRA68N 的 6.0。使用闹钟音量有什么不同?

【问题讨论】:

  • 由于在任何一个答案中都没有明确说明,这些参数作为标志将被忽略。它将始终通过默认流以最大音量播放。不过,将它们设置在适当的setter 确实可以解决它。
  • 这个答案可能会帮助到这里的人:stackoverflow.com/a/53390067/826946

标签: android audio


【解决方案1】:

在 Moto G Android 6.0 上测试

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            AudioAttributes aa = new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_ALARM)
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .build();
            ringtone.setAudioAttributes(aa);
        } else {
            ringtone.setStreamType(AudioManager.STREAM_ALARM);
        }

【讨论】:

    【解决方案2】:

    这里的回复对我有帮助,但对我不起作用。我打开了自己的问题here 来解决它。

    这是我的工作解决方案。

    mediaPlayerScan = new MediaPlayer();
    try {
      mediaPlayerScan.setDataSource(getContext(),
              Uri.parse(getString(R.string.res_path) + R.raw.scan_beep));
    
      if (Build.VERSION.SDK_INT >= 21) {
        mediaPlayerScan.setAudioAttributes(new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_ALARM)
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .build());
      } else {
        mediaPlayerScan.setAudioStreamType(AudioManager.STREAM_ALARM);
      }
      mediaPlayerScan.prepare();
    } catch (IOException e) {
      e.printStackTrace();
    }
    

    【讨论】:

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