Android 当我的Cordova应用程序进入后台时,如何在InApp浏览器上暂停YouTube视频?
我正在使用Cordova和Ionic框架开发一个Android应用程序。我正在使用iApp浏览器播放YouTube视频,代码如下:Android 当我的Cordova应用程序进入后台时,如何在InApp浏览器上暂停YouTube视频?,android,cordova,ionic-framework,phonegap-plugins,inappbrowser,Android,Cordova,Ionic Framework,Phonegap Plugins,Inappbrowser,我正在使用Cordova和Ionic框架开发一个Android应用程序。我正在使用iApp浏览器播放YouTube视频,代码如下: window.open('https://www.youtube.com/embed/rAiw2SXPS-4', '_self'); 但当我在播放视频时按下设备上的home(主页)按钮时,视频不会暂停。由于此问题,我的应用程序在提交到Google Play后被拒绝,原因如下: 您提交的内容因违反YouTube API服务条款而启用YouTube视频的后台播放而被拒
window.open('https://www.youtube.com/embed/rAiw2SXPS-4', '_self');
但当我在播放视频时按下设备上的home(主页)按钮时,视频不会暂停。由于此问题,我的应用程序在提交到Google Play后被拒绝,原因如下:
您提交的内容因违反YouTube API服务条款而启用YouTube视频的后台播放而被拒绝。如果此提交是对现有应用程序的更新,则在此更新之前发布的版本仍可在Google Play中使用。请修改你的应用程序并重新提交。其他详细信息已发送到您帐户所有者的电子邮件地址
我寻找了一个解决办法,但没有运气。有人能帮忙吗?使用$ionicPlatform,您可以使用“开启”方法: 它基于Cordova暂停事件:
document.addEventListener("pause", onPause, false);
function onPause() {
// Handle the pause event
}
请参阅ionic文档和cordova文档。我也在努力寻找在设备锁定时暂停(而不是停止)正在进行的视频的完整解决方案,但没有成功。最终,我通过将几个部分结合在一起找到了解决方案 以下是完成YouTube播放器设备锁定暂停的指令:
import { Directive, ElementRef, OnInit } from '@angular/core'
import { Platform } from 'ionic-angular'
import * as _ from 'lodash-es'
/* tslint:disable */
(function (apiInit) {
let _registerYouTubeAPIIfNotAlready = function () {
if (!window[ 'onYouTubeIframeAPIReady' ]) {
window[ 'onYouTubeIframeAPIReady' ] = function () {
apiInit.youTubeApiRegistered = true
if ((typeof apiInit.callback !== "undefined") && _.isFunction(apiInit.callback)) {
apiInit.callback()
}
}
} else {
console.error("trying to register YouTube API when it's already registered")
}
}
apiInit.setupYouTubeApiOrDefault = function (callback) {
if ((typeof callback === "undefined") || !_.isFunction(callback)) {
_registerYouTubeAPIIfNotAlready()
return
}
if(apiInit.youTubeApiRegistered){
callback()
return;
}
apiInit.callback = callback
_registerYouTubeAPIIfNotAlready()
}
}(window[ 'youTubeApiInit' ] = window[ 'youTubeApiInit' ] || {}))
@Directive({
selector: "[preventYoutubePlayOnBackground]",
})
export class PreventYouTubePlayOnBackgroundDirective implements OnInit {
public static youTubeIframeAPI = 'https://www.youtube.com/iframe_api'
public static injectYouTubeIframeApi(): void {
let youTubeCheckQuery = "script[src*='" + PreventYouTubePlayOnBackgroundDirective.youTubeIframeAPI + "']"
if (!document.querySelector(youTubeCheckQuery)) {
// from YouTube API documentation
let tag = document.createElement('script')
tag.src = PreventYouTubePlayOnBackgroundDirective.youTubeIframeAPI
let firstScriptTag = document.getElementsByTagName('script')[ 0 ]
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag)
}
}
public iframeId: string
private youTubeIframeElm: any
constructor(
public elm: ElementRef,
private platform: Platform,) {
this.youTubeIframeElm = elm.nativeElement
this.iframeId = this.youTubeIframeElm.getAttribute('id')
}
ngOnInit(): void {
this.platform.ready().then(() => {
PreventYouTubePlayOnBackgroundDirective.injectYouTubeIframeApi()
window[ 'youTubeApiInit' ].setupYouTubeApiOrDefault(() => {
this.setYouTubeApi()
this.platform.pause.subscribe(() => {
let player = new window[ 'YT' ].Player(this.iframeId) // TODO: add youtube API node module
player.a.contentWindow.postMessage('{"event":"command","func":"' + 'pauseVideo' + '","args":""}', '*')
})
})
})
}
private setYouTubeApi(): void {
let url = new URL(this.youTubeIframeElm.src)
if (!url.searchParams.get("enablejsapi")) { // enabling youTube js api to be able to create player
let prefix = (this.youTubeIframeElm.src.indexOf("?") === -1) ? "?" : "&"
this.youTubeIframeElm.src += prefix + "enablejsapi=true"
}
}
}
嵌入式YouTube播放器的HTML将为:
<iframe id="onboarding-video"
width="400"
height="300"
[src]="videoUrl"
frameborder="0"
allowfullscreen
preventYoutubePlayOnBackground
iframe-id="onboarding-video">
</iframe>
您还需要创建Angular 1 style指令,而不是上面写的TypeScript指令。在调用inappbrowser的
open
方法时,需要在选项中设置shouldPauseonSsuspend=yes
。请参阅此处的文档:
类似这样的方法会奏效:
window.open('http://google.com','_blank', 'shouldPauseOnSuspend=yes');
非常感谢。我尝试此事件以获取应用程序的暂停事件。但是如何通过应用浏览器暂停视频?!我做了一项研究,发现了各种解决方案,但并非所有这些都是好的:-从cordova直接打开youtube应用程序-删除视频DOM节点,然后将其再次放入cordova WebView(如果是iframe)-如果您可以以另一种方式显示视频,我建议您查看下面的链接,我从未使用过这个,但它看起来很有趣:@Anu你能解决这个问题吗?我也面临同样的问题。
(function() {
// same kind of logic here as written in above constructor body
$ionicPlatform.on('pause', function(event) {
// pausing player here
});
}())
window.open('http://google.com','_blank', 'shouldPauseOnSuspend=yes');