02-23-2017 02:55 AM
Hi team,
Below is the sentence from the Advanced CSDK Developer's Guide:
"When there is no video stream being sent or received, the video view and preview view renders a full frame of green. Only when streaming does video appear."
It seems this green screen is by design. However, I wanted to ask whether there is a way to change this?
Thanks and regards,
Murat
02-28-2017 12:46 AM
Hi Murat.
Thank you for your question.
I don't believe it is possible to change the colour of this but let me find out more information for you.
Can I just confirm If you are interested in any platform in particular?
Cheers,
Rach D
02-28-2017 08:14 AM
Hi Rach,
Thanks for the reply. Sorry, I forgot to mention in my first message. This is only for Android platform.
iOS is working fine but in Android we see the green screen.
Thanks and regards,
Murat
03-01-2017 02:22 AM
Hi Murat.
Thank you for the update, I've just had a quick discussion with the team here and they asked me to check if you have tried this:
"Register as a VideoSurfaceListener, and implement the onSurfaceRenderingStarted() method, and only display the VideoSurface in the app once rendering has started."
Our Sample application uses this approach and doesn't display the green frames.
If this doesn't work for you please do let us know and we can investigate into this further. We will in that case however need to know more information on what you are trying to achieve and where the issue is occurring.
Cheers,
Rach
03-01-2017 09:40 AM
Hi Rach,
I will try this and let you know about the results.
Thanks and regards,
Murat
03-13-2017 08:52 AM
Hi Rach,
We tried but it did not work. Do you have a sample code snippet for this?
Thanks and regards,
Murat
03-14-2017 01:50 AM
Hi Murat.
That's no problem, do you have access to our sample application? You can use the code from there if so, it may even be worth checking that is what you are looking for by previewing the sample.
Cheers,
Rach D
03-14-2017 08:21 AM
Hi Rach,
Do you mean the sample application coming with the SDK?
Thanks and regards,
Murat
03-15-2017 04:08 AM
Hi Rach,
The related code in the SDK is as follows:
----------------------------------------------------------------------------------------------------------------------------
@Override
public void onSurfaceRenderingStarted(VideoSurface videoSurface)
{
if (videoViews.contains(videoSurface))
{
assignVideoSurfaceToCall(videoSurface);
}
if (listener != null)
{
listener.onSurfaceRenderingStarted(videoSurface);
}
}
----------------------------------------------------------------------------------------------------------------------------
My customer's code is as follows:
----------------------------------------------------------------------------------------------------------------------------
public void onSurfaceRenderingStarted(VideoSurface videoSurface) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
remotePreviewContainer.setVisibility(View.VISIBLE);
}
});
----------------------------------------------------------------------------------------------------------------------------
Do you see a problem with this code?
Thanks and regards,
Murat
03-15-2017 07:36 AM
Hi Murat.
Would you be able to give a little more information on the customers code? a larger snippet would be good but we are looking to find out of the video view was visible before the renderingStarted event?
Cheers,
Rach
03-15-2017 11:32 AM
Hi Rach,
I could not attach the file itself. It is little bit long but I am pasting the code of the class here. Thank you very much for your support.
Regards,
Murat
------------------------------------------------------------------------------------------------------------------------------------------------------------
public class MainActivity extends AppCompatActivity implements UCListener, VideoSurfaceListener {
private UC uc;
private Phone phone;
private RelativeLayout container;
private RelativeLayout remotePreviewContainer;
private VideoSurface remotePreview;
private RelativeLayout selfPreviewContainer;
private VideoSurface selfPreview;
private Button startStopButton;
private com.alicecallsbob.fcsdk.android.phone.Call activeCall;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
container = new RelativeLayout(this);
setContentView(container);
encryptionTest();
remotePreviewContainer = new RelativeLayout(this);
remotePreviewContainer.setBackgroundColor(Color.BLACK);
remotePreviewContainer.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
container.addView(remotePreviewContainer);
selfPreviewContainer = new RelativeLayout(this);
selfPreviewContainer.setBackgroundColor(Color.BLACK);
RelativeLayout.LayoutParams selfPreviewContainerParams = new RelativeLayout.LayoutParams(Utils.convertPx(80), Utils.convertPx(100));
selfPreviewContainerParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
selfPreviewContainerParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
selfPreviewContainerParams.setMargins(0, 0, Utils.convertPx(10), Utils.convertPx(10));
selfPreviewContainer.setLayoutParams(selfPreviewContainerParams);
container.addView(selfPreviewContainer);
RelativeLayout.LayoutParams startStopLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
startStopLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
startStopLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
startStopLayoutParams.setMargins(0, 0, 0, Utils.convertPx(10));
startStopButton = new Button(this);
startStopButton.setText("Start");
container.addView(startStopButton, startStopLayoutParams);
startStopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
postToGetSessionId();
}
});
PermissionManager pm = PermissionManager.create(this);
pm.with(android.Manifest.permission.CAMERA, android.Manifest.permission.RECORD_AUDIO).request();
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setSpeakerphoneOn(true);
}
private void postToGetSessionId(){
String postDataJSON =
"{\n" +
" \"webAppId\": \"OdeaRemoteExpertProject\",\n" +
" \"allowedOrigins\": [\"*\"],\n" +
" \"urlSchemeDetails\": {\n" +
" \"host\": \"remoteexpert.odeabank.com.tr\",\n" +
" \"port\": \"443\",\n" +
" \"secure\": true\n" +
" },\n" +
" \"voice\": {\n" +
" \"username\": \"assist-m2v7r3jpb0jsk5j28ok4b5o4s\",\n" +
" \"displayName\": \"An Anonymous User\",\n" +
" \"domain\": \"10.224.60.211\"\n" +
" },\n" +
" \"uuiData\": \"deneme1\"\n" +
"};";
OkHttpClient httpClient = new OkHttpClient();
Request request = new Request.Builder()
.url("https://remoteexpert.odeabank.com.tr/gateway/sessions/session")
.post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), postDataJSON))
.build();
httpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.v("Error", "Error");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.v("Response", response.toString());
JSONObject responseData = null;
try {
responseData = new JSONObject(response.body().string());
if (responseData != null) {
final String sessionId = responseData.getString("sessionid");
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
startSession(sessionId);
}
});
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
private void startSession(String sessionId) {
uc = UCFactory.createUc(this, sessionId, this);
uc.setNetworkReachable(true);
uc.setTrustManager(new TrustAllCerts());
uc.setHostnameVerifier(new NullHostNameVerifier());
uc.startSession();
phone = uc.getPhone();
phone.addListener(new PhoneListener() {
@Override
public void onIncomingCall(com.alicecallsbob.fcsdk.android.phone.Call call) {
}
@Override
public void onCaptureSettingChange(PhoneVideoCaptureSetting phoneVideoCaptureSetting, int i) {
}
@Override
public void onLocalMediaStream() {
}
});
phone.setCamera(CAMERA_FACING_FRONT);
//phone.setVideoOrientation(Surface.ROTATION_0);
phone.setVideoOrientation(270);
phone.setPreferredCaptureResolution(PhoneVideoCaptureResolution.RESOLUTION_960x720);
remotePreview = phone.createVideoSurface(MainActivity.this, new Point(remotePreviewContainer.getWidth(), remotePreviewContainer.getHeight()), MainActivity.this);
remotePreviewContainer.addView(remotePreview);
remotePreviewContainer.setVisibility(View.GONE);
selfPreview = phone.createVideoSurface(MainActivity.this, new Point(selfPreviewContainer.getWidth(), selfPreviewContainer.getHeight()), MainActivity.this);
selfPreview.setZOrderOnTop(true);
selfPreviewContainer.addView(selfPreview);
phone.setPreviewView(selfPreview);
}
@Override
public void onSessionStarted() {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
try {
activeCall = phone.createCall("sip:80003@10.224.60.211", true, true, new CallListener() {
@Override
public void onDialFailed(com.alicecallsbob.fcsdk.android.phone.Call call, String s, CallStatus callStatus) {
}
@Override
public void onCallFailed(com.alicecallsbob.fcsdk.android.phone.Call call, String s, CallStatus callStatus) {
}
@Override
public void onMediaChangeRequested(com.alicecallsbob.fcsdk.android.phone.Call call, boolean b, boolean b1) {
}
@Override
public void onStatusChanged(com.alicecallsbob.fcsdk.android.phone.Call call, CallStatus callStatus) {
}
@Override
public void onStatusChanged(com.alicecallsbob.fcsdk.android.phone.Call call, CallStatusInfo callStatusInfo) {
}
@Override
public void onRemoteDisplayNameChanged(com.alicecallsbob.fcsdk.android.phone.Call call, String s) {
}
@Override
public void onRemoteMediaStream(com.alicecallsbob.fcsdk.android.phone.Call call) {
}
@Override
public void onInboundQualityChanged(com.alicecallsbob.fcsdk.android.phone.Call call, int i) {
}
@Override
public void onRemoteHeld(com.alicecallsbob.fcsdk.android.phone.Call call) {
}
@Override
public void onRemoteUnheld(com.alicecallsbob.fcsdk.android.phone.Call call) {
}
});
activeCall.setVideoView(remotePreview);
} catch (CallCreationWithErrorException e) {
e.printStackTrace();
}
}
});
}
@Override
public void onSessionNotStarted() {
}
@Override
public void onSystemFailure() {
}
@Override
public void onConnectionLost() {
}
@Override
public void onConnectionRetry(int i, long l) {
}
@Override
public void onConnectionReestablished() {
}
@Override
public void onGenericError(String s, String s1) {
}
@Override
public void onFrameSizeChanged(int i, int i1, VideoSurface.Endpoint endpoint, VideoSurface videoSurface) {
}
@Override
public void onSurfaceRenderingStarted(VideoSurface videoSurface) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
remotePreviewContainer.setVisibility(View.VISIBLE);
}
});
}
private void encryptionTest() {
String userID = "************";
String password = "***************";
String encryptred = null;
try {
encryptred = EncryptionManager.encrypt(userID, password);
Log.v("EncryptionManager::encryptData", encryptred);
}
catch (Exception e) {
e.printStackTrace();
}
try {
String decrypted = EncryptionManager.decrypt(encryptred, password);
Log.v("EncryptionManager::decryptData", decrypted);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------------
03-16-2017 02:21 AM
Thanks Murat.
Will get back to you as soon as we can.
Cheers,
Rach
03-16-2017 03:09 AM
A potential issue we see is with the 'onSurfaceRenderingStarted' callback. It seems to be being called for both local preview and the remote preview. There doesn't seem to be a distinction between the two and it's possible that the remote view is being made visible when the local preview has started rendering.
Could you try
if (videoSurface == myRemoteSurface) {//make remote visible}
and see if that helps?
We're hoping by making a clear definitive between the two you may not see the green screen issue any longer.
Cheers,
Rach D
03-17-2017 05:42 AM
Hi Rach,
We tried this but unfortunately still the same. We are receiving the onSurfaceRenderingStarted event and we are checking if videoSurface == myRemoteSurface. However, again we are seeing the green background for a few seconds.
When is the onSurfaceRenderingStarted event coming? Is it triggered by the SIP OK message or by the RTP packets coming?
Thanks and regards,
Murat
03-17-2017 06:21 AM
Hi Murat.
Thank you for your reply. Can I just confirm if the green background has improved to only a few seconds or a few seconds was always the case?
Was there any change saw after you added the above suggestion?
For the SurfaceRenderingStarted I believe it's the incoming RTP packets but let me clarify that with the team to be 100% sure.
Cheers,
Rach
Discover and save your favorite ideas. Come back to expert answers, step-by-step guides, recent topics, and more.
New here? Get started with these tips. How to use Community New member guide