六、通过服务器开启监控后 问题
通过服务器后开启监控,就要求每次挂断可以马上再重连,因为大脑端是开serversocket,需要设置端口重用,不然重新打开时,会提示绑定端口报错,
有一个小地方(serverSocket.close,记得server开启线程运行最后要关闭serverSocket!!!),忘记写了,导致调了好久的bug
五、改为视频监控遇到问题
之前只在定制机上测试,视频一直没有问题,后来换了机子,出现两个问题。
一是 setParameters failed,设置camera的参数时,报错,后来查了好久,网上很多说是setPreviewSize,需要先获取可用,再设置,这个之前我已经写过获取最佳预览size的方法,就是先从parameters中get到所有可用的PreviewSize,依次跟宽高比计算得到的size,按理说应该获取到的PreviewSize应该没有问题,然后又查了好久~~结果!还是在这里,我的previewSize是从parameters的到的,但我前面有句parameters.setPreviewFpsRange(15,25); 这个PreviewFpsRange不是计算的得到的,是我随便改的!!所以会报错,以后调bug要细心啊,逻辑清楚一下。mark。
二是,解决上面问题后,预览图片数据还是没有获取到,logcat测试最后发现是camera的setPreviewCallback()方法没有调用,又查了好久Google到http://stackoverflow.com/questions/8985869/camera-setpreviewcallback-previewcallback-not-working,这个中找到问题所在
也就是说某些机子上(因为之前我没有设置setPreviewDisplay也可以正常显示)必须要setPreviewDisplay(surfaceholder)才会调用setPreviewCallback!!!
加上后解决。
四、本周在做按钮旋转,
测试机是返回、home、menu键是虚拟的,显示在屏幕低端的那种。加之 手机横屏的宽高比太诡异,然后又参考了一些Android的拍照app,这种虚拟键的横屏之虚拟键还是在竖屏底部(即原来的位置)。
so 大众的横竖屏解决方案,应该是强制竖屏,但是按钮可以根据屏幕旋转来转动。也就是伪横竖屏切换,哈哈。
所以要做可以根据屏幕旋转来进行自动旋转的按钮。
(这里学到的点 就是考虑问题的方法,理清思路,找到关键问题。一定要知道自己想做什么,关键的难点、问题在哪里,
找到问题是什么然后解决)
考虑的是重写一个ImageView,让它可以根据屏幕旋转进行旋转。
这里的问题就是1)在强制竖屏的状态下,如何获取屏幕的旋转,
-----------------------实现一个OrientationEventListener可以获取屏幕旋转角度,顺时针的。
2)如何根据屏幕转动角度,进行重绘。
----------------------------------重写onDraw方法,getDrawable获取imageview图片,然后canvas坐标变换,旋转操作,然后invalidate();
三、按返回键崩溃,手机自带返回键
崩溃报的错是发送接收线程thread已经运行之类的。
debug找到的原因是每次按返回键,就会重启一次VideoCallActivity, 全生命周期。。。不知道为什么!!!没找到原因
但是解决了问题,当时考虑 1)重写onKeyDown方法,监听返回键事件。。但是没有试验。
直接2)解决了,2)改了VideoCallActivity 的launchmode ,由standard 改为 singleTask ,成功解决。
二、 通话回音 、噪音的问题。
- 噪音如果不是太近的话不会太大,
- 回音问题比较研究,
感觉跟手机有点关系,外放的喇叭跟话筒太近了,还有就是测试机质量的问题,另一个张用的那个手机,自己跟自己通话噪音就很小,回音也比较弱。而我用的那个噪音特别大,两个手机通话,我的回音大些,另一个几乎没有。考虑换手机试一下,测试机太少,无果。
考虑语音编码,网上下载了一个g724编码,需要用到jni和ndk编程。看了一下需要配置和下载的东西,略麻烦,待试验。
一、视频通话时间长 报错崩溃
大约4、5分钟左右,
1、 ImageReceiverEOEF
AudioReceiver EOEF
EOEF 没有结束标志错误,原因是因为用的ObjectoutputStream,没有加 outputstream.close(); 加上解决。
但是传的是数据流byte[],byte数组,
2、 AudioSender 出现StreamCurruptedException, 流损坏。。。查原因说是没有插入结束标志。 还是因为传递的是byte[]
考虑 BufferedInputStream, 或者ByteArrayInputStream试试来着,但是发现加上,outputStream.close();之后问题解决。。。说明还是互传数据的时候的问题,没有细心写好。哎
3、 都改好之后 大约四五分钟会出现 OOM ,内存泄露, OutOfMemory, 出错位置是SurfaceView绘制的时候新建Bitmap,因为绘制是每次接受camera预览图片YUV数据,压缩为jpeg,转为byteArray传递过来。。接收端 将接收到byte[],构造成Bitmap,绘制一帧一帧的图片,
搜索了好久, 1)关于优化bitmap,加了如下代码:
if(bitmap != null && !bitmap.isRecycled()){
bitmap.recycle();
bitmap = null;
}
System.gc(); 没有用,还是会出现OOM,只不过时间可能长了点。
错误依旧是在这一行 bitmap = BitmapFactory.decodeByteArray(data, 0,data.length, options);
2)Google得到一条看起来比较有用的,在配置文件Mainifest.xml中- application中加 android:largeHeap="true"
还是会OOM。
3)查了BitmapFactory的源码,
public static Bitmap decodeByteArray(byte imageData[], int offset, int length, int preferredWidth, int preferredHeight)
{
if((offset | length) < 0 || imageData.length < offset + length)
throw new ArrayIndexOutOfBoundsException();
else
return nativeDecodeData(imageData, offset, length, preferredWidth, preferredHeight);
}发现是调用底层的代码,应该没问题。。
这边依旧无解,
考虑 在try catch 中捕获OOM,崩溃后重启视频。待试验、
考虑MediaRecoder,MediaPlayer,感觉不太行,只能存文件播放,直接传数据流不行。
有考虑过是surfaceview绘图的问题,这边可以再看看。 SurfaceTexture之类?