Android MediaPlayer - 如何在 STREAM_ALARM 中播放?

Posted

技术标签:

【中文标题】Android MediaPlayer - 如何在 STREAM_ALARM 中播放?【英文标题】:Android MediaPlayer - how to play in the STREAM_ALARM? 【发布时间】:2011-10-26 19:01:34 【问题描述】:

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

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 权限。

谢谢!

【问题讨论】:

【参考方案1】:

我不知道为什么会发生这种情况,但是下面的代码有效。您应该使用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();

【讨论】:

最好把uri写成:Uri.parse("android.resource://"+mContext.getPackageName()+"/"+R.raw.sound)【参考方案2】:

问题是您使用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();

更多信息请参见this link。

【讨论】:

【参考方案3】:

1。 setAudioStreamType(int streamtype)

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

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

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

【讨论】:

【参考方案4】:

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

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

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

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

【讨论】:

找到了一种更简单的方法(SDK >= 21):MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.<sound>, new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM).build(), audioManager.generateAudioSessionId());【参考方案5】:

尝试以下方法:

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

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

希望对你有帮助

【讨论】:

我用 player.prepare() 尝试过,但没有任何区别。仍然没有播放音频。我将流音量存储到稍后在我的应用程序中使用的变量中,我暂时取出分配以帮助调试。

以上是关于Android MediaPlayer - 如何在 STREAM_ALARM 中播放?的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中使用 MediaPlayer 播放音频文件

如何在 android 的 mediaplayer 中停止和播放新歌曲?

Android 如何更改默认 VideoView / MediaPlayer 全屏?

Android -- MediaPlayer内部实现简析

android的MediaPlayer.create方法怎么用

如何仅使用 mediaplayer android 通过耳机播放音频