无法使用 STREAM_VOICE_CALL 在 android java 中通过 MediaPlayer 播放音频

Posted

技术标签:

【中文标题】无法使用 STREAM_VOICE_CALL 在 android java 中通过 MediaPlayer 播放音频【英文标题】:Can't use STREAM_VOICE_CALL to play audio via MediaPlayer in android java 【发布时间】:2014-06-18 15:22:01 【问题描述】:

我尝试通过 MediaPlayer 的 setAudiostreamType(AudioManager.STREAM_VOICE_CALL) 播放许多音频 (mp3) 文件;但是 mp.start();不播放也不抛出异常。 该设置适用于 SoundPool,但限制为 5 秒,某些文件最多可播放 8 秒。 我在这里附上部分代码:

    String s = absolutepath.get(position);
    Uri u = Uri.parse(s);
    playing = (MediaPlayer) MediaPlayer.create(MainActivity.this, u);
    playing.setOnPreparedListener(this);

onPrepared 包括:

    @Override
public void onPrepared(MediaPlayer mp) 
    // TODO Auto-generated method stub
    spProgress.cancel();
    mp.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
    try 
    mp.start();
     catch (IllegalStateException e) 
        Toast.makeText(this, "exception", Toast.LENGTH_SHORT).show();
    

我在没有 try/catch 甚至没有监听器的情况下尝试过这个。它播放的唯一时间是当我不使用流类型 STREAM_VOICE_CALL 时。

SoundPool 可以播放相同的文件:

SoundPool sp = new SoundPool(1, AudioManager.STREAM_VOICE_CALL, 0);
sp.load(s, 1);
sp.setOnLoadCompleteListener(this);

听众:

@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) 
    // TODO Auto-generated method stub
    if (status == 0) 
        spProgress.cancel();
        sp.play(sampleId, 1, 1, 1, 0, 1);
     else 
        Toast.makeText(this, "failed to load", Toast.LENGTH_SHORT).show();
    

【问题讨论】:

【参考方案1】:

其实我也遇到了同样的问题,而且谷歌的指南在这里很糟糕——确实有点棘手,但解释起来很简单:

由于您需要更改 STREAM,然后再次准备()您的 MediaPlayer,您将通过以下操作使其正常工作:

    Resources res = getResources();
    AssetFileDescriptor afd = res.openRawResourceFd(R.raw.tts_a);

    mp = new MediaPlayer();
    //mp.reset();
    mp.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
    mp.setLooping(false);
    try 
        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
        mp.prepare();
     catch (IOException e) 
        e.printStackTrace();
    

    mp.start();

实际的技巧是不要使用 MediaPlayer.create,因为它会调用 prepare 本身!因此,您无法设置 Stream。通过使用 AssetFileDescriptor 设置文件,您可以设置 Stream 并在之后调用您的 prepare()!

【讨论】:

谢谢,我目前无法访问我的编码 PC,但我会在获得访问权限时尝试您的解决方案。不过这需要一段时间。在那之前,我想相信你,除非另有证明,否则我会将其标记为正确答案:-) 我刚刚在 AIDE 上测试了它,我可以确认它有效!谢谢老哥,非常感谢! :-D 现在使用新的媒体播放器,但重置后它可以工作

以上是关于无法使用 STREAM_VOICE_CALL 在 android java 中通过 MediaPlayer 播放音频的主要内容,如果未能解决你的问题,请参考以下文章

Android6.0源码开发之修改默认音量default及max和min

无法在 SQL Server 视图中使用工作查询:“IS”无法识别“>”无法识别

请帮助我无法构建相同的这个小部件,我无法使用颤振代码在列表视图中构建容器

无法使用 react-testing-library 运行测试“无法在模块外使用 import 语句”错误

无法安装“GSImageViewerController Pod”并且无法在项目中快速使用其代码

无法修复错误:此配置部分无法在此路径中使用