YouTubeAndroidPlayerAPI não consigo reproduzir alguns vídeos
- Atualização 09/05/2016 17:10 - O problema parece estar relacionado à data de publicação do vídeo ... Na última semana de abril, publiquei muitos vídeos no YouTube, publicados até as 19:00 de abril 27 funcionam corretamente, enquanto os cobrados às 21:15 no mesmo dia discutem o assunto, como se entre 19 e 21 de abril de 27 tivessem sido introduzidas algumas atualizações ou alterações nos vídeos pelo YouTube. Tentei carregar um novo vídeo agora e isso também tem o mesmo problema.
Estou com um problema estranho no YouTubeAndroidPlayerAPI. Uso o YouTubePlayerSupportFragment (mas tenho o mesmo problema com o YouTubePlayerFragment) para reproduzir vídeos no meu aplicativo, alguns reproduzem perfeitamente, outros mostram o erro "Ocorreu um problema durante a reprodução. Toque para tentar novamente. "
Quando isso acontece no Android Monitor, vejo o erro da API do YouTube:
05-08 11:25:22.145 20521-20521/? E/YouTubeAndroidPlayerAPI: fmt.noneavailable
oae: Video not supported/available
at oab.a(SourceFile:212)
at nvl.a(SourceFile:383)
at nvl.a(SourceFile:706)
at nvr.a(SourceFile:1144
at nsn.onPostExecute(SourceFile:2102)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Se eu tocar no ícone do YouTube no vídeo para reproduzi-lo no aplicativo do YouTube, o vídeo será reproduzido corretamente no aplicativo oficial.
Se o vídeo tiver monetização ativa, o vídeo do anúncio será exibido normalmente; no final, o erro será exibido.
Eu tentei:
Use YouTubePlayerFragment em vez de YouTubePlayerSupportFragmentUse Activity em vez de AppCompatActivityIncorporar o vídeo em uma página HTML, ele funciona corretamenteMonetização desativada, nada mudaChaves diferentes, uma para depuração e outra para a liberaçãoMuito obrigado por ajudar!
Atualização 11/05/2016 Parece ser um bug do YouTube; a única solução aceitável no momento parece abrir o vídeo no aplicativo oficial do YouTube com uma intenção ou substituir o fragmento do player por um WebView. O WebView padrão é muito limitado e não mostra o botão para exibir o vídeo em tela cheia. Você precisa criar uma classe que estenda o WebChromeClient:
public class MyWebChromeClient extends WebChromeClient {
FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
if (mCustomView != null) {
callback.onCustomViewHidden();
return;
}
mContentView = (LinearLayout) findViewById(R.id.scheda_video_activity);
mContentView.setVisibility(View.GONE);
mCustomViewContainer = new FrameLayout(SchedaVideoActivity.this);
mCustomViewContainer.setLayoutParams(LayoutParameters);
mCustomViewContainer.setBackgroundResource(android.R.color.black);
view.setLayoutParams(LayoutParameters);
mCustomViewContainer.addView(view);
mCustomView = view;
mCustomViewCallback = callback;
mCustomViewContainer.setVisibility(View.VISIBLE);
setContentView(mCustomViewContainer);
}
@Override
public void onHideCustomView() {
if (mCustomView == null) {
return;
} else {
mCustomView.setVisibility(View.GONE);
mCustomViewContainer.removeView(mCustomView);
mCustomView = null;
mCustomViewContainer.setVisibility(View.GONE);
mCustomViewCallback.onCustomViewHidden();
mContentView.setVisibility(View.VISIBLE);
setContentView(mContentView);
}
}
}
e, em seguida, inicialize o WebView:
WebView myWebView = (WebView)findViewById(R.id.webview);
MyWebChromeClient mWebChromeClient = new MyWebChromeClient();
myWebView.setWebChromeClient(mWebChromeClient);
myWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
Por fim, carregue o vídeo no WebView:
myWebView.loadUrl("https://www.youtube.com/embed/"+youtube_id);
Se você deseja adaptar as dimensões do WebView ao player do YouTube, faça o seguinte:
Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
myWebView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int)Math.round(size.x/1.77)));