Can';t在android java中使用流式语音呼叫通过MediaPlayer播放音频

Can';t在android java中使用流式语音呼叫通过MediaPlayer播放音频,java,android,audio,android-mediaplayer,soundpool,Java,Android,Audio,Android Mediaplayer,Soundpool,我曾尝试通过MediaPlayer的setAudioStreamType(AudioManager.STREAM\u VOICE\u CALL)播放许多音频(mp3)文件;但是mp.start();不会播放,也不会引发异常。 该设置与SoundPool一起工作,但限制为5秒,有些文件最多播放8秒。 我在此附上代码部分: String s = absolutepath.get(position); Uri u = Uri.parse(s); playing = (Media

我曾尝试通过MediaPlayer的setAudioStreamType(AudioManager.STREAM\u VOICE\u 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);
其中包括:

    @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();
    }
}
我尝试过这个,没有尝试/捕捉,甚至没有听众。它唯一播放的时间是我不使用流式流式语音呼叫时

可以使用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();
    }
}

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

当您需要更改流,然后再次准备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本身!因此,您无法设置流。通过使用AssetFileDescriptor设置文件,您可以设置流,然后调用prepare()

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

当您需要更改流,然后再次准备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本身!因此,您无法设置流。通过使用AssetFileDescriptor设置文件,您可以设置流,然后调用prepare()

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