近期做过案例,部分安卓设备不支持wav波形文件,不能正常播放语音,我的解决方案是将文件接收后,进行转化,转化成MP3格式,再调用mediaplayer进行朗读
1、OkHttpClient 声明,并调用接口
OkHttpClient okHttpClient = new OkHttpClient.Builder().
//在这里,还可以设置数据缓存等
//设置超时时间
connectTimeout(20, TimeUnit.SECONDS).
readTimeout(20, TimeUnit.SECONDS).
writeTimeout(20, TimeUnit.SECONDS).
callTimeout(20, TimeUnit.SECONDS).
//错误重连
retryOnConnectionFailure(true).
build();
Request.Builder builder = new Request.Builder();
Request request = builder.get().url(“接口地址”).build();
// 3将Request封装成call
okhttp3.Call call = okHttpClient.newCall(request);
2、请求的结果通过异步返回进行处理调用
基本逻辑:接收到流文件,将流文件保存到制定的位置,最后关闭流
call.enqueue(new okhttp3.Callback() {
@Override
public void onFailure(okhttp3.Call call, IOException e) {
"//AI文件下载失败了"
}
@Override
public void onResponse(okhttp3.Call call, Response response) throws IOException {
try {
InputStream inputStream = response.body().byteStream();
long length = response.body().contentLength();
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(destPath);
} catch (Exception e) {
e.printStackTrace();
}
try {
XLog.d("AI语音流文件路径:" + destPath);
byte[] bytes = new byte[2048];
int len = 0, sum = 0;
while ((len = inputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, len);
sum +=len;
int progress = (int) (sum * 1.0f / length * 100);
XLog.d("流文件下载中,当前进度:" + progress);
}
fileOutputStream.flush();
} catch (Exception e) {
} finally {
try {
fileOutputStream.close();
inputStream.close();
} catch (Exception e) {
}
}
}
3、调用mediaplayer进行播放
基本逻辑:调用完成后将上面下载的文件给删除了即可
mediaPlayer.reset();// 重置mediaPaly,建议在初始化mediaplay立即调用。
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(destPath);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start();
}
}
);
mediaPlayer.prepareAsync();
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
return false;
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
FileUtils.deleteFile(destPath);
}
});
播放的时候一定注意下,如果mediaplayer调用的时候没有声音,注意查看下有木有加
mediaPlayer.reset() 这句话