gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:59:02 38 4
gpt4 key购买 nike

我正在编写一个 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)

04-10 19:32:03.115: E/MediaPlayer(3411): Error (-38,0)

一些研究(我现在找不到链接)告诉我 setAudioStreamType() 不能在调用 prepare() 之后调用,并且create() 隐式调用 prepare()

无论如何,我应该如何setAudioStreamType()而不出现这样的错误?

最佳答案

您可以调用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();

关于android - (Android MediaPlayer) 如果 MediaPlayer.create() 隐式调用 prepare(),我应该如何调用 setAudioStreamType()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10097954/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com