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

时间:2012-04-10 23:35:16

标签: 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;
    }

我的问题是,通过调用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()

2 个答案:

答案 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();
}