(Android MediaPlayer)如果MediaPlayer.create()隐式调用prepare(),我应该如何调用setAudioStreamType()?

fin*_*oop 12 android android-mediaplayer

我正在编写一个使用服务的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;
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,通过调用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()没有这样的错误我该怎么办?

kco*_*ock 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();
Run Code Online (Sandbox Code Playgroud)