首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(Android MediaPlayer)如果MediaPlayer.create()隐式调用MediaPlayer.create(),那么如何调用MediaPlayer.create()?

(Android MediaPlayer)如果MediaPlayer.create()隐式调用MediaPlayer.create(),那么如何调用MediaPlayer.create()?
EN

Stack Overflow用户
提问于 2012-04-10 23:35:16
回答 2查看 11.7K关注 0票数 12

我正在编写一个Android警报应用程序,它使用服务来播放警报音。目前,我可以让音频播放,但它播放的形式,可以通过关闭设备的音量静音。因此,我试图添加一个对setAudioStreamType(AudioManager.STREAM_ALARM);的调用来防止这种情况发生。

对于服务的onStartCommand()函数,我有以下内容:

代码语言:javascript
复制
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()呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-10 23:46:25

您可以调用mp.reset(),然后设置流类型、数据源,然后进行准备。或者,只需使用默认构造函数并自己处理初始化。

编辑:

代码语言:javascript
复制
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();
票数 13
EN

Stack Overflow用户

发布于 2016-03-16 16:29:09

公认的答案是抛出一个IllegalStateException。这起作用了

代码语言:javascript
复制
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();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10097954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档