从未调用过QuickBlox onRemoteVideoTrackReceive

时间:2016-02-20 13:37:23

标签: android quickblox quickblox-android

我正在尝试从this资源创建一个简单的点对点视频通话。

我只是做了它需要的所有东西,但我仍然没有从远程渲染 它只能从本地摄像头渲染而sql> INSERT INTO your_feature_table (feature_value) VALUES ('size => 124, quality => great, format => A4') 1 row affected in 18ms sql> INSERT INTO your_feature_table (feature_value) VALUES ('format => A4') ERROR: new row for relation "your_feature_table" violates check constraint "restricted_keys" Detail: Failing row contains ("format"=>"A4"). sql> INSERT INTO your_feature_table (feature_value) VALUES ('') ERROR: new row for relation "your_feature_table" violates check constraint "restricted_keys" Detail: Failing row contains (). sql> INSERT INTO your_feature_table (feature_value) VALUES ('a => 124, b => great, c => A4') ERROR: new row for relation "your_feature_table" violates check constraint "restricted_keys" Detail: Failing row contains ("a"=>"124", "b"=>"great", "c"=>"A4"). sql> INSERT INTO your_feature_table (feature_value) VALUES ('size => 124, quality => great, format => A4, incorrect_key => error') ERROR: new row for relation "your_feature_table" violates check constraint "restricted_keys" Detail: Failing row contains ("size"=>"124", "format"=>"A4", "quality"=>"great", "incorrect_ke...). 从未调用过。 我正在使用qb 2.5 sdk 我也从onRemoteVideoTrackReceive编译了样本sample-videochat-webrtc,其工作正常。 这是我的项目代码:

mudol:应用

qb-sdk

项目:____

apply plugin: 'com.android.application'

android {
compileSdkVersion 'Google Inc.:Google APIs:23'
buildToolsVersion "23.0.2"

defaultConfig {
    applicationId "com.hm.runanddelete"
    minSdkVersion 14
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-  android.txt'), 'proguard-rules.pro'
    }
}
  }

dependencies {
testCompile 'junit:junit:4.12'
compile fileTree(dir: 'libs', include: ['*.jar'])


}

清单

// Top-level build file where you can add configuration options common to    all sub-projects/modules.

buildscript {
repositories {
    jcenter()
}

dependencies {
    classpath 'com.android.tools.build:gradle:2.0.0-alpha5'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}
}

allprojects {
repositories {
    jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

MainActivity

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hm.runanddelete">

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera.front" />
<uses-feature android:name="android.hardware.microphone"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />




<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

布局

public class MainActivity extends Activity implements QBRTCClientSessionCallbacks, QBRTCClientVideoTracksCallbacks, QBRTCSignalingCallback, QBRTCSessionConnectionCallbacks {
static final String APP_ID = "...";
static final String AUTH_KEY = "...";
static final String AUTH_SECRET = "...";
static final String ACCOUNT_KEY = "...";

RTCGLVideoView LocalVideoView;
RTCGLVideoView remoteVideoView;

String login = "";
String password = "";


QBChatService chatService;
QBRTCClient rtcClient;


EditText et_user, et_paw, et_id;
Button btn_call, btn_login;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    et_user = (EditText) findViewById(R.id.et_caller_user);
    et_paw = (EditText) findViewById(R.id.et_caller_pw);
    et_id = (EditText) findViewById(R.id.et_caller_tid);
    btn_call = (Button) findViewById(R.id.btn_caller_call);
    btn_login = (Button) findViewById(R.id.btn_caller_login);

    LocalVideoView = (RTCGLVideoView) findViewById(R.id.localView);
    remoteVideoView = (RTCGLVideoView) findViewById(R.id.opponentView);


    btn_login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            login = et_user.getText().toString();
            password = et_paw.getText().toString();
            initializingQB();
        }
    });
    btn_call.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            starcall(Integer.parseInt(et_id.getText().toString()));

        }
    });


}

private void initializingQB() {
    QBSettings.getInstance().init(getApplicationContext(), APP_ID, AUTH_KEY, AUTH_SECRET);
    QBSettings.getInstance().setAccountKey(ACCOUNT_KEY);

    final QBUser user = new QBUser(login, password);

// CREATE SESSION WITH USER
// If you use create session with user data,
// then the user will be logged in automatically
    QBAuth.createSession(login, password, new QBEntityCallback<QBSession>() {
        @Override
        public void onSuccess(QBSession session, Bundle bundle) {

            user.setId(session.getUserId());
            Toast.makeText(MainActivity.this, "Loging in!!!", Toast.LENGTH_LONG).show();
            Log.w("qb", "logedin app");
            // INIT CHAT SERVICE
            chatService = QBChatService.getInstance();
            Log.w("qb", "loging chat");
            // LOG IN CHAT SERVICE
            chatService.login(user, new QBEntityCallback<QBUser>() {


                @Override
                public void onSuccess(QBUser qbUser, Bundle bundle) {
                    Log.w("qb", "loged chat");
                    initQBRTCClient();

                }

                @Override
                public void onError(QBResponseException errors) {
                    Log.w("qb", "not loged\n" + errors.getMessage());
                    //error

                }
            });
        }

        @Override
        public void onError(QBResponseException errors) {
            //error
            Toast.makeText(MainActivity.this, "ERROR!!!\n" + errors.getMessage(), Toast.LENGTH_LONG).show();
        }
    });
}

private void initQBRTCClient() {
    rtcClient = QBRTCClient.getInstance(this);

    // Add signalling manager
    QBChatService.getInstance().getVideoChatWebRTCSignalingManager().addSignalingManagerListener(new QBVideoChatSignalingManagerListener() {
        @Override
        public void signalingCreated(QBSignaling qbSignaling, boolean createdLocally) {
            if (!createdLocally) {
                rtcClient.addSignaling((QBWebRTCSignaling) qbSignaling);
            }
        }
    });

    rtcClient.setCameraErrorHendler(new VideoCapturerAndroid.CameraErrorHandler() {
        @Override
        public void onCameraError(final String s) {
            MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
                }
            });
        }
    });


    // Configure
    //


    QBRTCConfig.setMaxOpponentsCount(2);
    QBRTCConfig.setDisconnectTime(30);
    QBRTCConfig.setAnswerTimeInterval(301);
    QBRTCConfig.setDebugEnabled(true);


    //rtcClient.addVideoTrackCallbacksListener(this);

    // rtcSession.removeVideoTrackCallbacksListener(this);
    // Add activity as callback to RTCClient
    rtcClient.addSessionCallbacksListener(this);

    //rtcClient.addVideoTrackCallbacksListener(this);

    //QBRTCClient.getInstance(this).removeSessionCallbacksListener(this);
    // Start mange QBRTCSessions according to VideoCall parser's callbacks
    rtcClient.prepareToProcessCalls();


}

private void starcall(int tid) {


    //Set conference type
//There are two types of calls:
// - QB_CONFERENCE_TYPE_VIDEO - for video call;
// - QB_CONFERENCE_TYPE_AUDIO - for audio call;
    QBRTCTypes.QBConferenceType qbConferenceType = QBRTCTypes.QBConferenceType.QB_CONFERENCE_TYPE_VIDEO;


//Initiate opponents list
    List<Integer> opponents = new ArrayList<Integer>();
    opponents.add(tid); //12345 - QBUser ID

//Set user information
// User can set any string key and value in user info
// Then retrieve this data from sessions which is returned in callbacks
// and parse them as he wish
    Map<String, String> userInfo = new HashMap<>();
    userInfo.put("key", "value");

//Init session
    QBRTCSession session = rtcClient.createNewSessionWithOpponents(opponents, qbConferenceType);
    session.addVideoTrackCallbacksListener(this);
    session.addSessionCallbacksListener(this);
    session.addSessionCallbacksListener(this);


//Start call
    session.startCall(userInfo);
    Log.w("qb", "startcall: " + String.valueOf(tid));
}


@Override
public void onReceiveNewSession(QBRTCSession qbrtcSession) {
    // obtain received user info
    Map<String, String> userInfo = qbrtcSession.getUserInfo();

    // .....
    // ..... your code
    // .....


    // Set userInfo
    // User can set any string key and value in user info
    userInfo = new HashMap<String, String>();
    userInfo.put("Key", "Value");

    // Accept incoming call

    qbrtcSession.addVideoTrackCallbacksListener(this);
    qbrtcSession.addSessionCallbacksListener(this);
    qbrtcSession.acceptCall(userInfo);

    Log.w("call", "accepted:" + String.valueOf(qbrtcSession.getSessionID()));
}

@Override
public void onUserNotAnswer(QBRTCSession qbrtcSession, Integer integer) {

}

@Override
public void onCallRejectByUser(QBRTCSession qbrtcSession, Integer integer, Map<String, String> map) {

}

@Override
public void onCallAcceptByUser(QBRTCSession qbrtcSession, Integer integer, Map<String, String> map) {


}

@Override
public void onReceiveHangUpFromUser(QBRTCSession qbrtcSession, Integer integer) {

}

@Override
public void onUserNoActions(QBRTCSession qbrtcSession, Integer integer) {

}

@Override
public void onSessionClosed(QBRTCSession qbrtcSession) {

}

@Override
public void onSessionStartClose(QBRTCSession qbrtcSession) {

}


@Override
public void onLocalVideoTrackReceive(QBRTCSession qbrtcSession, QBRTCVideoTrack qbrtcVideoTrack) {
    Log.w("TAG", "onLocalVideoTrackReceive()");
    //  RTCGLVideoView videoView, QBRTCVideoTrack videoTrack, boolean remoteRenderer

    fillVideoView(LocalVideoView, qbrtcVideoTrack, false);

}

@Override
public void onRemoteVideoTrackReceive(QBRTCSession qbrtcSession, QBRTCVideoTrack qbrtcVideoTrack, Integer integer) {
    Log.w("TAG", "onRemoteVideoTrackReceive(),,,");

    fillVideoView(remoteVideoView, qbrtcVideoTrack, true);

}


private void fillVideoView(RTCGLVideoView videoView, QBRTCVideoTrack videoTrack, boolean remoteRenderer) {
    videoTrack.addRenderer(new VideoRenderer(remoteRenderer ?
            videoView.obtainVideoRenderer(RTCGLVideoView.RendererSurface.MAIN) :
            videoView.obtainVideoRenderer(RTCGLVideoView.RendererSurface.SECOND)));
}

@Override
public void onSuccessSendingPacket(QBSignalingSpec.QBSignalCMD qbSignalCMD, Integer integer) {

}

@Override
public void onErrorSendingPacket(QBSignalingSpec.QBSignalCMD qbSignalCMD, Integer integer, QBRTCSignalException e) {

}

@Override
public void onStartConnectToUser(QBRTCSession qbrtcSession, Integer integer) {
    Log.w("connection", "onStartConnectToUser");
}

@Override
public void onConnectedToUser(QBRTCSession qbrtcSession, Integer integer) {
    Log.w("connection", "onConnectedToUser");
}

@Override
public void onConnectionClosedForUser(QBRTCSession qbrtcSession, Integer integer) {
    Log.w("connection", "onConnectionClosedForUser");

}

@Override
public void onDisconnectedFromUser(QBRTCSession qbrtcSession, Integer integer) {
    Log.w("connection", "onDisconnectedFromUser");

}

@Override
public void onDisconnectedTimeoutFromUser(QBRTCSession qbrtcSession, Integer integer) {
    Log.w("connection", "onDisconnectedTimeoutFromUser");

}

@Override
public void onConnectionFailedWithUser(QBRTCSession qbrtcSession, Integer integer) {
    Log.w("connection", "onConnectionFailedWithUser");

}

@Override
public void onError(QBRTCSession qbrtcSession, QBRTCException e) {
    Log.w("connection", "onError");

}
}
如果我错了,请纠正我!

更新 已添加 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:custom="http://schemas.android.com/apk/res-auto" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.hm.runanddelete.MainActivity"> <com.quickblox.videochat.webrtc.view.RTCGLVideoView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/localView" android:layout_width="150dp" android:layout_height="150dp" /> <com.quickblox.videochat.webrtc.view.RTCGLVideoView android:id="@+id/opponentView" android:layout_width="150dp" android:layout_height="150dp" android:layout_alignParentBottom="true" android:layout_alignRight="@+id/btn_caller_login" android:layout_alignEnd="@+id/btn_caller_login" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="LOGIN" android:id="@+id/btn_caller_login" android:layout_below="@+id/et_caller_pw" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/et_caller_user" android:hint="QB USERNAME" android:layout_below="@+id/localView" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="25dp" android:layout_alignRight="@+id/et_caller_pw" android:layout_alignEnd="@+id/et_caller_pw" android:text="" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/et_caller_pw" android:layout_below="@+id/et_caller_user" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignRight="@+id/btn_caller_login" android:layout_alignEnd="@+id/btn_caller_login" android:hint="QB PASSWORD" android:text="" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/et_caller_tid" android:hint="QB TARGET ID" android:layout_below="@+id/et_caller_pw" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_toLeftOf="@+id/btn_caller_login" android:layout_toStartOf="@+id/btn_caller_login" android:text="" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="MAKE CALL" android:id="@+id/btn_caller_call" android:layout_below="@+id/et_caller_tid" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignRight="@+id/btn_caller_login" android:layout_alignEnd="@+id/btn_caller_login" /> </RelativeLayout> 在接听电话后记录:

addSessionCallbacksListener
打电话:

02-23 22:23:09.731 18666-18666/com.hm.runanddelete W/qb: logedin app
02-23 22:23:09.787 18666-18666/com.hm.runanddelete W/qb: loging chat
02-23 22:23:13.051 18666-18958/com.hm.runanddelete W/qb: loged chat
02-23 22:24:10.454 18666-19016/com.hm.runanddelete W/call: accepted:835226fc-d9a5-4bbc-82db-3ad6e0524168
02-23 22:24:11.230 18666-19016/com.hm.runanddelete W/TAG: onLocalVideoTrackReceive()

2 个答案:

答案 0 :(得分:0)

在建立与远程跟踪的连接之后,将调用回调的onRemoteVideoTrackReceive方法。要侦听连接状态更改,可以通过rtcSession.addSessionCallbacksListener()添加QBRTCSessionConnectionCallbacks侦听器。当对等体建立连接时,将首先调用onStartConnectToUser方法,而不是onConnectedToUser,然后对等体将通过onRemoteVideoTrackReceive方法接收远程跟踪。 确保调用所有方法。

答案 1 :(得分:0)

我认为您遇到的问题是,在接听呼叫后,呼叫发起者不会收到激活“ onCallAcceptByUser ”的接受回叫消息,然后开始渲染远程视频。 / p>

您的所有设置似乎都是正确的,使其运行所需的更改是您应该在不同的活动或片段上实施“ QBRTCSessionConnectionCallbacks QBRTCClientVideoTracksCallbacks ”。

因此MainActivity将实现 QBRTCClientSessionCallbacks QBRTCSessionConnectionCallbacks “和其他活动或片段让我们称之为ConversationFragment”将实现“ QBRTCSessionConnectionCallbacks QBRTCClientVideoTracksCallbacks “,在这种情况下,您在呼叫发起方逻辑中创建的会话实例或您在呼叫接收方逻辑中创建的会话将在MainActivity并使ConversationFragment可以访问它以初始化“ QBRTCSessionConnectionCallbacks QBRTCClientVideoTracksCallbacks ”。

我没有时间调查此问题的原因,即“如果所有CallBack侦听器都在同一个Activity中实现,则不会收到呼叫接受消息”,如上所述将它们分开是如何解决问题的。但这就是我修复它的方式。

注意:我在2.5和2.5版本上遇到过这个问题。 2.5.1。修复程序适用于两者。

如果您需要进一步的帮助,请告诉我。

小更新注意: 我在iOS上遇到过类似的问题。在视图控制器中创建QBSession对象并将其传递给另一个视图控制器可防止调用“ConnectedToUser”回调方法,从而阻止调用完全建立。 要修复它,只需创建QBSession 或者在处理该调用的同一个ViewController中调用“createNewSession”