openfire发送音频文件(amr)

弄了小半天,终于鼓捣出来了,要利用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传送数据就可以,方法如下:


 

消息接受端代码:

这也正好解决了:传送音频的同时,不能传输音频名称、音频长度的问题。还能解决判断穿过来的是音频还是文本(传送的开头加个标记)

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值