我正在编写一个使用服务的Android闹钟应用程序,以播放闹钟铃声。目前,我可以播放音频,但它可以通过调低设备音量来缓存。因此,我正在尝试添加对setAudioStreamType(AudioManager.STREAM_ALARM);
的调用来阻止此操作。
我的服务的onStartCommand()
功能有以下内容:
MediaPlayer mMP;
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
try
{
mMP = MediaPlayer.create(this, R.raw.alarm);
mMP.setAudioStreamType(AudioManager.STREAM_ALARM);
mMP.setLooping(true);
//mMP.prepare(); commented out since prepare() is called in create
}
catch (Exception e)
{
e.printStackTrace();
}
if (mMP != null) mMP.start();
return START_STICKY;
}
我的问题是,通过调用setAudioStreamType(),MediaPlayer从不播放音频。如果我对该行进行评论,则播放音频。
有了这行,我得到以下运行时错误:
04-10 19:32:03.115:E / MediaPlayer(3411):在状态8中调用setAudioStream
04-10 19:32:03.115:E / MediaPlayer(3411):错误(-38,0)
04-10 19:32:03.115:E / MediaPlayer(3411):在状态0中调用
04-10 19:32:03.115:E / MediaPlayer(3411):错误(-38,0)
04-10 19:32:03.115:E / MediaPlayer(3411):错误(-38,0)
04-10 19:32:03.115:E / MediaPlayer(3411):错误(-38,0)
一些研究(我现在找不到链接)告诉我,setAudioStreamType()
被调用后无法调用prepare()
,create()
隐式调用prepare()
}}
在任何方面,如果没有这样的错误我应该如何setAudioStreamType()
?
答案 0 :(得分:13)
您可以调用mp.reset()
然后设置流类型,数据源,然后进行准备。或者只使用默认构造函数并自己处理初始化。
编辑:
Resources res = getResources();
AssetFileDescriptor afd = res.openRawResourceFd(R.raw.alarm);
mp.reset();
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setLooping(true);
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mp.prepare();
mp.start();
答案 1 :(得分:3)
接受的答案是抛出 IllegalStateException 。这是有效的
MediaPlayer mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(
this,
getCustomToneUri()
);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}