15

我尝试使用以下代码在我的应用程序中设置媒体播放器的音频流,但是当我这样做时,我在模拟器中听不到声音。如果我没有为播放器设置流,那么音频播放正常。我确定我用错了,但不能锻炼,有什么帮助吗?

MediaPlayer player = MediaPlayer.create(getApplicationContext(), R.raw.test_audio);

AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
audioManager.getStreamVolume(AudioManager.STREAM_ALARM);
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM), AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
player.setAudioStreamType(AudioManager.STREAM_ALARM);
player.start();

注意:我已经在清单中添加了 MODIFY_AUDIO_SETTINGS 权限。

谢谢!

4

5 回答 5

28

我不知道为什么会发生这种情况,但是下面的代码有效。setDataSource()您应该使用而不是使用来设置数据源create()

此代码有效:

MediaPlayer mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setDataSource(this,Uri.parse("android.resource://PACKAGE_NAME/"+R.raw.soundfile));
mp.prepare();
mp.start();

此代码不起作用

MediaPlayer mp = MediaPlayer.create(this, R.raw.soundfile);
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.prepare();
mp.start();
于 2011-11-30T02:43:46.453 回答
6

问题是您MediaPlayer.create()用于创建 MediaPlayer。Create函数调用prepare()最终确定您的媒体并且不允许您更改的函数AudioStreamType

解决方案是使用setDataSource而不是create

MediaPlayer mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setLooping(true);
try {
   mp.setDataSource(getApplicationContext(), yourAudioUri);
   mp.prepare();
} catch (IOException e) {
   e.printStackTrace();
}
mp.start();

有关更多信息,请参阅此链接

于 2017-01-04T00:38:50.213 回答
2

1. setAudioStreamType(int streamtype)

必须在 prepare() 之前调用此方法;

2. MediaPlayer.create(Context context, int resid)

成功时,prepare() 将已经被调用,并且不能再次调用。

于 2013-07-17T11:21:56.743 回答
2

API 22 中已弃用此处的解决方案

我打开了自己的线程来解决这个问题。

这是一个更新的工作解决方案。

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();
}
于 2018-06-15T20:04:23.403 回答
0

尝试以下操作:

player.setAudioStreamType(AudioManager.STREAM_ALARM);
player.prepare();
player.start();

为什么要调用“audioManager.getStreamVolume(AudioManager.STREAM_ALARM);”?该值未存储在变量中,因此它毫无用处;)

我希望这有帮助

于 2011-08-14T15:09:06.157 回答