- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们实现了Sinch
在 angular 2
Web应用程序。
一切正常,除非我尝试使用 sinch
调用用户电话演示。
当应用程序在前台运行时,它会响铃并建立连接。
当应用程序在后台运行时,没有任何 react 。
在 Angular 应用程序中,onCallProgressing
eventlistener 没有被触发,页面只是等到它吐出这个错误消息:
似乎问题在于缺少 jquery
功能,因为我将项目重写为 angular.
我想知道如何使用 sinch API 解决此问题。
错误的完整堆栈跟踪如下:
Error: Error executing listener: onCallEnded
at SinchError (http://cdn.sinch.com/latest/sinch.min.js:4:4093) [<root>]
at g.<anonymous> (http://cdn.sinch.com/latest/sinch.min.js:4:18715) [<root>]
at Array.forEach (native) [<root>]
at g.execListener (http://cdn.sinch.com/latest/sinch.min.js:4:18650) [<root>]
at g.mxpHangup (http://cdn.sinch.com/latest/sinch.min.js:4:30318) [<root>]
at g.hangup (http://cdn.sinch.com/latest/sinch.min.js:5:12013) [<root>]
at g.<anonymous> (http://cdn.sinch.com/latest/sinch.min.js:5:4195) [<root>]
at Zone.runTask (http://localhost:4200/polyfills.bundle.js:6135:47) [<root> => <root>]
at ZoneTask.invoke (http://localhost:4200/polyfills.bundle.js:6329:33) [<root>]
at data.args.(anonymous function) (http://localhost:4200/polyfills.bundle.js:7360:25) [<root>]
这是使用 sinch 管理调用的 Angular 组件:
import {Component, AfterViewInit, ViewChild, OnInit, OnDestroy} from '@angular/core';
import {Router, ActivatedRoute} from "@angular/router";
import {HttpService} from "../http.service";
import 'rxjs/add/operator/map';
import {Response} from "@angular/http";
import {Employee} from "../employee";
import {Subscription} from "rxjs/Rx";
import {TimeOutService} from "../../time-out.service";
declare var SinchClient: any;
@Component({
selector: 'mp-callpage',
templateUrl: './callpage.component.html',
styleUrls: ['./callpage.component.scss']
})
export class CallpageComponent implements OnInit, OnDestroy {
public contact: Employee;
public _video;
public _audio;
public volume: number = 0.2;
public vol: number = 20;
public volumechange: boolean = false;
private volumefade = [];
id: number;
private sub: Subscription;
sinchClient: any;
public callUserName = "";
public incomingVideoSource = "";
private callClient;
private call;
constructor(private router: Router, private route: ActivatedRoute, private http: HttpService, private timeOutService: TimeOutService) {
}
ngOnInit() {
this.sub = this.route.params.subscribe(params => {
this.id = +params['id'];
if (this.id != 0) {
//noinspection TypeScriptValidateTypes
this.http.getData('employees', 'orderBy="id"&equalTo=' + this.id)
.map((response:Response) => response.json())
.subscribe(
(data:Employee) => {
for (var property in data) {
if (data.hasOwnProperty(property)) {
this.contact = data[property];
}
}
}
);
} else {
this.contact = new Employee({
name: "the reception",
id: 0
}, "the receptionist", "the receptionist", 0, false, "0000")
}
});
var _self = this;
this.sinchClient = new SinchClient({
applicationKey: 'xxx',
capabilities: {calling: true, video: true}
});
/*** Name of session, can be anything. ***/
var sessionName = 'sinchSessionVIDEO-' + this.sinchClient.applicationKey;
/*** Check for valid session. NOTE: Deactivated by default to allow multiple browser-tabs with different users. ***/
var sessionObj = JSON.parse(localStorage[sessionName] || '{}');
console.log(sessionObj);
if(sessionObj.userId) {
this.sinchClient.start(sessionObj)
.then(function() {
localStorage[sessionName] = JSON.stringify(_self.sinchClient.getSession());
console.log("a valid session was found")
}).fail(function(response) {
console.log(response);
});
}else {
console.log("no user id");
}
/*** Set up callClient and define how to handle incoming calls ***/
this.callClient = this.sinchClient.getCallClient();
this.callClient.initStream().then(function() { // Directly init streams, in order to force user to accept use of media sources at a time we choose
// $('div.frame').not('#chromeFileWarning').show();
});
}
/*** Define listener for managing calls ***/
private callListeners = {
onCallProgressing: (call) => {
this._audio.play();
},
onCallEstablished: (call) => {
this._video.src = call.incomingStreamURL;
this._audio.pause();
this._audio.currentTime=0;
},
onCallEnded: (call) => {
this._video.src = '';
this.onCallEnd('/');
if(call.error) {
console.log("there was an error" + call.error.message);
}
}
};
/*** Make a new data call ***/
onCall() {
this.call = this.callClient.callUser(this.callUserName);
this.timeOutService.inCall = true;
this.timeOutService.interacted();
this.call.addEventListener(this.callListeners);
}
@ViewChild('video') video:any;
@ViewChild('ringback') audio:any;
ngAfterViewInit () {
this._audio = this.audio.nativeElement;
this._video = this.video.nativeElement;
if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia({ video: true, audio: true })
.then(stream => {
this._video.src = '';
this._video.play();
this._video.volume = 0.2;
})
}
}
onVolumeChange(direction: string) {
for (var i = 0; i < this.volumefade.length; i++) {
clearTimeout(this.volumefade[i]);
}
this.volumefade = [];
this.volumechange = true;
if (direction == 'down' && this._video.volume > 0.15) {
this._video.volume -= 0.1;
this.volume -= 0.1;
}else if (direction == 'up' && this._video.volume <= 0.9) {
this._video.volume += 0.1;
this.volume += 0.1;
}
this.volume = Math.round( this.volume * 10 ) / 10;
this.vol = this.volume * 100;
this.volumefade.push(setTimeout(() => { this.volumechange = false; }, 2000));
}
/*** Hang up a call ***/
onCallEnd(btn) {
if(this.call.getEndCause() != 'HUNG_UP'){
this.call && this.call.hangup();
}
this.navHome(btn);
}
navHome(url) {
setTimeout(() => { this.router.navigate([url]); }, 0);
}
ngOnDestroy() {
this.sub.unsubscribe();
this.timeOutService.inCall = false;
this.timeOutService.resetTimer.push(setTimeout(() => { this.router.navigate(['/']); window.location.reload() }, 100));
}
}
最佳答案
使用 sinch-rtc
对我有用正如 Savaj Patel 提到的那样。
示例:
sinchClient = new SinchClient({
applicationKey: 'YOUR KEY',
capabilities: {messaging: true},
onLogMessage: function(message) {
console.log(message);
}
});
sinchClient.start(CREDENTIALS).then(function() {
console.log('Success!');
})
关于jquery - Angular 2 项目中的 Sinch API 在 onCallProgressing 上超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42721579/
我从this下载了代码。我成功生成了应用程序 key 。 我实现了上面下载的示例中的示例代码,它在移动和网络上运行良好。但是当我尝试实现视频通话时出现错误 检索媒体流时出错 Overconstrain
我正在尝试访问另一个类中的一个类,但可能会出现此错误。我正在使用 sinch 在我的应用程序中实现应用程序到应用程序的电话调用,但它仍然无法正常工作。 这是我的错误 FATAL EXCEPTION:
无人应答调用以“超时”状态结束之前的时间似乎为 45 秒。 可以在 JS 或 Android api 中的任何位置进行调整吗? 最佳答案 不在 SDK 中,但如果您给我发邮件,我会在配置中为您更改它。
我已经使用 Parse + Sinch 设置了一个聊天应用程序(我主要使用 this official tutorial),并且我正在尝试以特定方式获取通知: 当MessagingActivity打开
是否可以基于唯一用户获得累积的 call 建立时间? 我在仪表板上找不到该信息。 最佳答案 该信息在Sinch仪表板中不可用,但可以通过REST API访问。作为合作伙伴,您还可以下载可用于收集这些指
我们可以使用 sinch api 在 swift 中创建一个即时消息应用程序吗?我尝试在 swift 应用程序中导入 sinch 框架,但导入后无法将 sinch 类导入到我的应用程序中。请帮忙。 最
SINCallDelegate 的所有委托(delegate)方法都工作正常,但大多数时候,尽管客户端连接成功,但音频无法工作。 最佳答案 Swift- 5 非常简单,我就完成了 //MARK:- a
我正在开发 Android 聊天应用程序,一切都很顺利。我已经设法将用户添加到解析数据库并在 friend fragment 上显示用户。 但后来 Sinch 来了。我按照他们网站上的说明将 SDK
我关注了 sinch tutorial用于制作消息传递应用程序。基于本教程,sinch 客户端从主要 Activity 开始。我能够使用 Parse 发送推送通知并创建一个通知生成器,但是当用户点击它
我需要使用 Sinch API 发送带有阿拉伯语文本的短信。我的短信包含 - 英语、阿拉伯语和数字号码。 我尝试过的 我已经阅读了 Sinch 的文档,但他们没有提供任何有关如何使用 UTF-16BE
如果应用程序在 iPhone(iOS 10) 中处于关闭状态,则无法发起调用。 我正在使用推送套件服务进行调用。如果应用程序在后台,我正在接听电话,但如果应用程序处于关闭状态,则会收到来自服务器的通知
我已经在 ios swift 项目中实现了 sinch 视频通话我已经遵循了 sinch 实现文档中给出的所有过程 https://www.sinch.com/docs/video/ios/#call
我实现了 Sinch + PushKit + CallKit,一切正常,但有一个脚本无法正常工作。第一个用户使用应用程序并将其从设备内存中删除,第二个用户第一次调用,第一个用户没有接听电话,如果第二个
我正在尝试在 Sinch 3.0.1 SDK 中运行消息传递示例应用程序。在 src 文件中,这一行: package com.sinch.android.rtc.sample.pstn; 抛出错误。
如何在Android中将sinch的远程 View 设置为全屏。 我尝试了 VideoController.setResizeBehaviour,但它不起作用。 最佳答案 您需要使用 Sinch se
我在我的项目中尝试了一个 sinch 视频通话示例,但是,我无法理解 sinch 视频通话示例中 sinchservice 类中的 CALL_ID 是什么。 最佳答案 这只是自定义字段名称,将在您接到
我想使用 sinch 创建一个 android 付费通话应用程序。sinch 包含一个回调 API 来获取调用的详细信息。我想使用它,但不知道如何使用。我阅读了文档。但这还不够 我的问题是, 对服务器
我已经正确设置了从推送通知开始调用的所有内容,但是接收者的 SINClient 没有调用 client:didReceiveIncomingCall: 方法,所以用户不可能接听电话。 我已经验证我的有
我希望我的 sinch 应用程序调用一个号码并要求应答者输入一个号码以选择他的语言。 到目前为止,我可以让她使用 POST 请求调用电话,其正文为: { "method
我只想在我的应用程序中使用sinch进行调用,到目前为止我已经关注了官方documentation因此,按照此链接,我正在构建 Sinch 客户端,如下所示: private var sinchCl
我是一名优秀的程序员,十分优秀!