我正在编写一个使用服务的
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): setAudioStream called in state 8
04-10 19:32:03.115: E/MediaPlayer(3411): error (-38,0)
04-10 19:32:03.115: E/MediaPlayer(3411): start called in state 0
04-10 19:32:03.115: E/MediaPlayer(3411): error (-38,0)
04-10 19:32:03.115: E/MediaPlayer(3411): Error (-38,0)
有些研究(现在我找不到链接)告诉我,在调用prepare()之后,setAudioStreamType()不能被调用,而create()隐含地调用prepare().
解决方法
您可以调用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();