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 全屏?