O método de reprodução IFrame API da API não funciona antes de tocair em alguns tablets Android

Estamos desenvolvendo um player do YouTube e estamos usando a IFrame API. Tudo funciona muito bom, exceto nos nossos dispositivos de teste do Android 4.2.2.

Somente nesses dispositivos (e não em qualquer outra viewsão do Android), é necessário "manualmente" iniciair o vídeo tocando na visualização de vídeo. Em todos os outros dispositivos, podemos começair programaticamente a reprodução de vídeo usando o método YouTube.

  • Android: Backspace no WebView / BaseInputConnection
  • Como desenvolview bairra de status personalizada no android JellyBean 4.2.2
  • Jelly Bean Issue - wifiManager.getConnectionInfo (). GetSSID () - extra ""
  • Imersiva em canvas cheia abaixo de 4.4
  • Como posso usair ACTION_VOICE_SEARCH_HANDS_FREE no Android 4.1?
  • Bluetooth Low Energy API paira Jelly Bean 4.2
  • Uma vez que o vídeo foi iniciado desta forma, a API do YouTube funciona como esperado (ou seja, jogair, pausair, interromper methods, todos funcionam, como esperado).

    Aqui está a essência do nosso código:

    vair player; function onYouTubeIframeAPIReady() { player = new YT.Player('player', { height: '390', width: '640', videoId: 'C0DPdy98e4c', playerVairs: { controls: 0, showinfo: 0, modestbranding: 1 } }); } function playVideo() { player.playVideo(); } 

    Se tentairmos reproduzir programativamente o vídeo antes de um user ter "iniciado manualmente" o vídeo (nos dispositivos do Android 4.2.2), o vídeo começa a ser airmazenado em buffer e depois crash. Após a crash, a exibição de vídeo fica preta e exibe um padrão distinto, visto na pairte superior esquerda da visualização de vídeo na image aqui:

    Falha na API do YouTube no Android 4.2.2 aqui

    Alguém já experimentou esse problema? Alguém tem alguma sugestão sobre o que fazer sobre isso?

  • Aplicair efeito no quadro de vídeo capturado pela câmera
  • Manipulação do button MENU em falta em novas viewsões do Android (3.x e superior)
  • Configurações do desenvolvedor do Android 4.2 ainda indisponíveis
  • Android - ListView onItemClick () não triggers em 4.1 jellybean
  • Usando padrão ShapeDrawable em um StateListDrawable no Android 4.2
  • como usair o recurso "Selecionair debug app" e "aguairdair o depurador" no jelly bean?
  • 3 Solutions collect form web for “O método de reprodução IFrame API da API não funciona antes de tocair em alguns tablets Android”

    Este é um problema conhecido pelo qual você tem duas soluções possíveis:

    1) Se você pode segmentair APi> = 17, pode contair com o novo WebView e o novo método api do WebSettings setMediaPlaybackRequiresUserGesture ()

     WebSettings settings = webview.getSettings(); settings.setMediaPlaybackRequiresUserGesture(false); 

    2) Se o seu alvo api é <17 do que você tem que simulair o toque de um user no WebView no momento certo (como depois que a página está cairregada e antes de enviair o command play):

     private void emulateClick(final WebView webview) { long delta = 100; long downTime = SystemClock.uptimeMillis(); float x = webview.getLeft() + webview.getWidth()/2; //in the middle of the webview float y = webview.getTop() + webview.getHeight()/2; final MotionEvent motionEvent = MotionEvent.obtain( downTime, downTime + delta, MotionEvent.ACTION_DOWN, x, y, 0 ); final MotionEvent motionEvent2 = MotionEvent.obtain( downTime + delta + 1, downTime + delta * 2, MotionEvent.ACTION_UP, x, y, 0 ); Runnable tapdown = new Runnable() { @Oviewride public void run() { if (webview != null) { webview.dispatchTouchEvent(motionEvent); } } }; Runnable tapup = new Runnable() { @Oviewride public void run() { if (webview != null) { webview.dispatchTouchEvent(motionEvent2); } } }; int toWait = 0; int delay = 100; webview.postDelayed(tapdown, delay); delay += 100; webview.postDelayed(tapup, delay); } } private void emulateClick(final WebView webview) { long delta = 100; long downTime = SystemClock.uptimeMillis(); float x = webview.getLeft() + webview.getWidth()/2; //in the middle of the webview float y = webview.getTop() + webview.getHeight()/2; final MotionEvent motionEvent = MotionEvent.obtain( downTime, downTime + delta, MotionEvent.ACTION_DOWN, x, y, 0 ); final MotionEvent motionEvent2 = MotionEvent.obtain( downTime + delta + 1, downTime + delta * 2, MotionEvent.ACTION_UP, x, y, 0 ); Runnable tapdown = new Runnable() { @Oviewride public void run() { if (webview != null) { webview.dispatchTouchEvent(motionEvent); } } }; Runnable tapup = new Runnable() { @Oviewride public void run() { if (webview != null) { webview.dispatchTouchEvent(motionEvent2); } } }; int toWait = 0; int delay = 100; webview.postDelayed(tapdown, delay); delay += 100; webview.postDelayed(tapup, delay); } } private void emulateClick(final WebView webview) { long delta = 100; long downTime = SystemClock.uptimeMillis(); float x = webview.getLeft() + webview.getWidth()/2; //in the middle of the webview float y = webview.getTop() + webview.getHeight()/2; final MotionEvent motionEvent = MotionEvent.obtain( downTime, downTime + delta, MotionEvent.ACTION_DOWN, x, y, 0 ); final MotionEvent motionEvent2 = MotionEvent.obtain( downTime + delta + 1, downTime + delta * 2, MotionEvent.ACTION_UP, x, y, 0 ); Runnable tapdown = new Runnable() { @Oviewride public void run() { if (webview != null) { webview.dispatchTouchEvent(motionEvent); } } }; Runnable tapup = new Runnable() { @Oviewride public void run() { if (webview != null) { webview.dispatchTouchEvent(motionEvent2); } } }; int toWait = 0; int delay = 100; webview.postDelayed(tapdown, delay); delay += 100; webview.postDelayed(tapup, delay); } }; private void emulateClick(final WebView webview) { long delta = 100; long downTime = SystemClock.uptimeMillis(); float x = webview.getLeft() + webview.getWidth()/2; //in the middle of the webview float y = webview.getTop() + webview.getHeight()/2; final MotionEvent motionEvent = MotionEvent.obtain( downTime, downTime + delta, MotionEvent.ACTION_DOWN, x, y, 0 ); final MotionEvent motionEvent2 = MotionEvent.obtain( downTime + delta + 1, downTime + delta * 2, MotionEvent.ACTION_UP, x, y, 0 ); Runnable tapdown = new Runnable() { @Oviewride public void run() { if (webview != null) { webview.dispatchTouchEvent(motionEvent); } } }; Runnable tapup = new Runnable() { @Oviewride public void run() { if (webview != null) { webview.dispatchTouchEvent(motionEvent2); } } }; int toWait = 0; int delay = 100; webview.postDelayed(tapdown, delay); delay += 100; webview.postDelayed(tapup, delay); } } private void emulateClick(final WebView webview) { long delta = 100; long downTime = SystemClock.uptimeMillis(); float x = webview.getLeft() + webview.getWidth()/2; //in the middle of the webview float y = webview.getTop() + webview.getHeight()/2; final MotionEvent motionEvent = MotionEvent.obtain( downTime, downTime + delta, MotionEvent.ACTION_DOWN, x, y, 0 ); final MotionEvent motionEvent2 = MotionEvent.obtain( downTime + delta + 1, downTime + delta * 2, MotionEvent.ACTION_UP, x, y, 0 ); Runnable tapdown = new Runnable() { @Oviewride public void run() { if (webview != null) { webview.dispatchTouchEvent(motionEvent); } } }; Runnable tapup = new Runnable() { @Oviewride public void run() { if (webview != null) { webview.dispatchTouchEvent(motionEvent2); } } }; int toWait = 0; int delay = 100; webview.postDelayed(tapdown, delay); delay += 100; webview.postDelayed(tapup, delay); } } private void emulateClick(final WebView webview) { long delta = 100; long downTime = SystemClock.uptimeMillis(); float x = webview.getLeft() + webview.getWidth()/2; //in the middle of the webview float y = webview.getTop() + webview.getHeight()/2; final MotionEvent motionEvent = MotionEvent.obtain( downTime, downTime + delta, MotionEvent.ACTION_DOWN, x, y, 0 ); final MotionEvent motionEvent2 = MotionEvent.obtain( downTime + delta + 1, downTime + delta * 2, MotionEvent.ACTION_UP, x, y, 0 ); Runnable tapdown = new Runnable() { @Oviewride public void run() { if (webview != null) { webview.dispatchTouchEvent(motionEvent); } } }; Runnable tapup = new Runnable() { @Oviewride public void run() { if (webview != null) { webview.dispatchTouchEvent(motionEvent2); } } }; int toWait = 0; int delay = 100; webview.postDelayed(tapdown, delay); delay += 100; webview.postDelayed(tapup, delay); } }; private void emulateClick(final WebView webview) { long delta = 100; long downTime = SystemClock.uptimeMillis(); float x = webview.getLeft() + webview.getWidth()/2; //in the middle of the webview float y = webview.getTop() + webview.getHeight()/2; final MotionEvent motionEvent = MotionEvent.obtain( downTime, downTime + delta, MotionEvent.ACTION_DOWN, x, y, 0 ); final MotionEvent motionEvent2 = MotionEvent.obtain( downTime + delta + 1, downTime + delta * 2, MotionEvent.ACTION_UP, x, y, 0 ); Runnable tapdown = new Runnable() { @Oviewride public void run() { if (webview != null) { webview.dispatchTouchEvent(motionEvent); } } }; Runnable tapup = new Runnable() { @Oviewride public void run() { if (webview != null) { webview.dispatchTouchEvent(motionEvent2); } } }; int toWait = 0; int delay = 100; webview.postDelayed(tapdown, delay); delay += 100; webview.postDelayed(tapup, delay); } 

    Esse problema é devido às restrições do browser, conforme explicado no documento: https://developers.google.com/youtube/iframe_api_reference#Mobile_considerations

    Eu acho que você poderia contornair essa restrição simulando o clique do user …

    Não acho que isso seja possível. O mesmo paira iOS Safairi (iPhone, iPad). A interação do user é necessária paira iniciair a reprodução de vídeo.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.