AnyChat技术支持论坛

标题: android切换画面问题 [打印本页]

作者: bdcn    时间: 2014-1-15 10:38
标题: android切换画面问题
我在android端首次设置视频播放,然后再设置UserCameraControl(id,0),然后重新设置id出现java.lang.IllegalArgumentException异常,android.view.Surface.lockCanvasNative(Native Method),请问如何解决
作者: admin    时间: 2014-1-15 10:43
您好,请上传logcat中更多关于“java.lang.IllegalArgumentException”异常的信息供我们分析,另请上传一份客户端的日志文件,谢谢。
作者: bdcn    时间: 2014-1-15 10:53
以下是异常
01-15 10:50:10.879: E/SurfaceHolder(3760): Exception locking surface
01-15 10:50:10.879: E/SurfaceHolder(3760): java.lang.IllegalArgumentException
01-15 10:50:10.879: E/SurfaceHolder(3760):         at android.view.Surface.lockCanvasNative(Native Method)
01-15 10:50:10.879: E/SurfaceHolder(3760):         at android.view.Surface.lockCanvas(Surface.java:88)
01-15 10:50:10.879: E/SurfaceHolder(3760):         at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:755)
01-15 10:50:10.879: E/SurfaceHolder(3760):         at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:731)
01-15 10:50:10.879: E/SurfaceHolder(3760):         at com.bairuitech.anychat.VideoRenderer.DrawByteBuffer(AnyChatVideoHelper.java:173)
01-15 10:50:10.879: E/SurfaceHolder(3760):         at com.bairuitech.anychat.AnyChatVideoHelper.ShowVideo(AnyChatVideoHelper.java:62)
01-15 10:50:10.879: E/SurfaceHolder(3760):         at com.bairuitech.anychat.AnyChatCoreSDK.OnVideoDataCallBack(AnyChatCoreSDK.java:528)
01-15 10:50:10.879: E/SurfaceHolder(3760):         at dalvik.system.NativeStart.run(Native Method)
作者: bdcn    时间: 2014-1-15 10:57
请问日志文件在什么位置
作者: admin    时间: 2014-1-15 10:58
您好,请修改一下:AnyChatVideoHelper::DrawByteBuffer,在里面加上一个try-catch,看是否能解决该问题。
作者: bdcn    时间: 2014-1-15 11:08
还是抛异常,并且画面没有切换
作者: admin    时间: 2014-1-15 11:14
您好,请用代码表述一下您的问题。
我在android端首次设置视频播放,然后再设置UserCameraControl(id,0),然后重新设置id出现java.lang.IllegalArgumentException异常

作者: 廖斌    时间: 2014-1-15 11:16
bdcn 发表于 2014-1-15 11:08
还是抛异常,并且画面没有切换

您好,你关闭视频,重新打开视频之后,userid有没有改变,变了的话SetVideoUser或者SetVideoPos对应的userid也要变的。
作者: bdcn    时间: 2014-1-15 11:21
int watcherId = -1;
                if (anychat.GetCameraState(watcherId) == 2
                                && anychat.GetUserVideoWidth(watcherId) != 0) {
                        SurfaceHolder holder = firstSurfaceView.getHolder();
                        holder.setFormat(PixelFormat.RGB_565);
                        holder.setFixedSize(anychat.GetUserVideoWidth(watcherId),
                                        anychat.GetUserVideoHeight(watcherId));
                        Surface s = holder.getSurface();
                        System.out.println("firstSurfaceView=" + watcherId);
                        anychat.SetVideoPos(watcherId, s, 0, 0, 0, 0);
                        anychat.UserCameraControl(watcherId, 1);
                        firstSurfaceOpen = true;

                        // 如果是采用Java视频显示,则需要将视频窗口与用户关联起来
                        if (AnyChatCoreSDK
                                        .GetSDKOptionInt(AnyChatDefine.BRAC_SO_VIDEOSHOW_DRIVERCTRL) == AnyChatDefine.VIDEOSHOW_DRIVER_JAVA) {
                                anychat.mVideoHelper.SetVideoUser(firstVideoIndex, watcherId);
                        }
                }

                anychat.UserCameraControl(watcherId, 0);
                watcherId = 209;
                if (anychat.GetCameraState(watcherId) == 2
                                && anychat.GetUserVideoWidth(watcherId) != 0) {
                        SurfaceHolder holder = firstSurfaceView.getHolder();
                        holder.setFormat(PixelFormat.RGB_565);
                        holder.setFixedSize(anychat.GetUserVideoWidth(watcherId),
                                        anychat.GetUserVideoHeight(watcherId));
                        Surface s = holder.getSurface();
                        System.out.println("firstSurfaceView=" + watcherId);
                        anychat.SetVideoPos(watcherId, s, 0, 0, 0, 0);
                        anychat.UserCameraControl(watcherId, 1);
                        firstSurfaceOpen = true;

                        // 如果是采用Java视频显示,则需要将视频窗口与用户关联起来
                        if (AnyChatCoreSDK
                                        .GetSDKOptionInt(AnyChatDefine.BRAC_SO_VIDEOSHOW_DRIVERCTRL) == AnyChatDefine.VIDEOSHOW_DRIVER_JAVA) {
                                anychat.mVideoHelper.SetVideoUser(firstVideoIndex, watcherId);
                        }
                }

大概逻辑就是这样,那个watcherId我确定已经改变
作者: admin    时间: 2014-1-15 11:45
您好,您在关闭用户视频“anychat.UserCameraControl(watcherId, 0);”之后没有关闭视频显示,正确的方法应该是:
  1. anychat.UserCameraControl(watcherId, 0);
  2. anychat.mVideoHelper.SetVideoUser(firstVideoIndex, -1);
复制代码
另外本地预览的视频surface不能和远程用户进行共用。从您上面帖的代码来看,好象是共用了?
作者: 廖斌    时间: 2014-1-15 11:46
bdcn 发表于 2014-1-15 11:21
int watcherId = -1;
                if (anychat.GetCameraState(watcherId) == 2
                                && anychat.GetUserVideoWidth( ...

您好,同一个surfaceview切换不同用户显示是可以的。你贴上来的代码流程有问题
1、打开对方A的视频,anychat.UserCameraControl(useridA, 1);
2、然后通过计时器判断到  if (anychat.GetCameraState(useridA) == 2
                                && anychat.GetUserVideoWidth(useridA) != 0) {
时执行
  1.                               && anychat.GetUserVideoWidth(watcherId) != 0) {
  2.                         SurfaceHolder holder = firstSurfaceView.getHolder();
  3.                         holder.setFormat(PixelFormat.RGB_565);
  4.                         holder.setFixedSize(anychat.GetUserVideoWidth(watcherId),
  5.                                         anychat.GetUserVideoHeight(watcherId));
  6.                         Surface s = holder.getSurface();
  7.                         System.out.println("firstSurfaceView=" + watcherId);
  8.                         anychat.SetVideoPos(watcherId, s, 0, 0, 0, 0);
  9.                         anychat.UserCameraControl(watcherId, 1);
  10. // 如果是采用Java视频显示,则需要将视频窗口与用户关联起来
  11.                         if (AnyChatCoreSDK
  12.                                         .GetSDKOptionInt(AnyChatDefine.BRAC_SO_VIDEOSHOW_DRIVERCTRL) == AnyChatDefine.VIDEOSHOW_DRIVER_JAVA) {
  13.                                 anychat.mVideoHelper.SetVideoUser(firstVideoIndex, watcherId);
  14.                         }
复制代码
3、参考标准demo的做法。

(本地视频是不能通过这种方式切换的)
  
作者: bdcn    时间: 2014-1-15 12:57
代码都是放在计时器里的,代码流程也是参考demo的做法,现在是第一次可以正常显示。我现在想把同一个surfaceview重新设置一个用户id,在显示的时候抛出异常
作者: bdcn    时间: 2014-1-15 13:07
(本地视频是不能通过这种方式切换的)
这种不能吗,不记得的上一个版本可以




欢迎光临 AnyChat技术支持论坛 (http://bbs.anychat.cn/) Powered by Discuz! X3