弄了小半天,终于鼓捣出来了,要利用openfire发送语音,openfire只能发送字符串或base64编码,咋整,只能将录好的音频文件按照二进制字节流读入到程序中,进行base64转码,存取到字符串中。然后发送到对方服务器,然后进行base64解码,并按照二进制将声音文件输出。不废话,上代码:
将amr音频文件按照字节流(byte[] data)读入到程序中,并进行base64转码:
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
path += "/mmmm.amr";
File fi = new File(path);
if (!fi.exists()) {
Toast.makeText(getApplicationContext(), "没找到该文件",
Toast.LENGTH_LONG).show();
return;
}
byte[] data = null;
try {
InputStream is = new FileInputStream(fi);
data = new byte[is.available()];
is.read(data);
is.close();
amrString = new String(Base64.encodeBytes(data));
//amrString = data.toString();();// 将字节数组转换为字符串 这句话不好使,转换后的字符串仅为:"23@231122",显然不对
Toast.makeText(getApplicationContext(),"字节流获取文件成功,获得的字符串为:" + amrString, Toast.LENGTH_LONG).show();
} catch (Exception ex) {
ex.printStackTrace();
}
其中base64不是调用的android系统的工具包,而是调用的asmack包的base64类。
将接收到的字符串按base64解码,然后按照字节流输出文件:
String recPath =Environment.getExternalStorageDirectory().getAbsolutePath() + "/mmmm1.amr";
try{
byte[] data = Base64.decode(msg.getBody());
OutputStream out = new FileOutputStream(recPath);
out.write(data);
out.flush();
out.close();
Toast.makeText(getApplicationContext(),"音频接收成功,即将为您播放", Toast.LENGTH_LONG).show();
}catch(Exception ex){
ex.printStackTrace();
}
后追加的问题:
我想在发送的同时,也发送录音时长和录音文件名称,所以就将base64编码后的字符串同时长和名称串联起来,中间用“^”分割,传过去之后用split将字符串分割成数组,没想到报错,崩溃,查来查去才发现,base64编码这玩意不能和别的串联,我猜测字符串连接时可能有编码的转换,导致base64编码被打乱了。
解决上面的问题:
用json传送数据就可以,方法如下:
消息接受端代码:
这也正好解决了:传送音频的同时,不能传输音频名称、音频长度的问题。还能解决判断穿过来的是音频还是文本(传送的开头加个标记)