2011-08-14 71 views
11

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

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权限添加到我的清单中了。

谢谢!

回答

0

尝试以下操作:

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

为什么你叫 “audioManager.getStreamVolume(AudioManager.STREAM_ALARM);”?该值不存储在一个变量,所以它是没有用处;)

我希望帮助

+0

我用player.prepare()试过了,但没有任何区别。仍然没有音频播放。我将流量存储到稍后在我的应用中使用的变量中,我暂时拿出作业来帮助调试。 – James

19

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

更好地写出这样的uri:'Uri.parse(“android.resource://”+ mContext.getPackageName()+“/”+ R.raw.sound)' –

2

1. setAudioStreamType(INT流类型)

必须调用此方法前准备( );

2. MediaPlayer.create(上下文的背景下,INT渣油)

成功时,准备()将已经被称为,不得再次调用。

3

问题是您正在使用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