Jon G
Jon G

Reputation: 1706

YouTube Android Player API INTERNAL_ERROR for multiple videos

Using the YouTube Android Player API sample code (version 1.2.2), if I change any of the video IDs over to one I have uploaded (e.g. "QVikru_w2hQ" or "u1n6E81rm80"), the thumbnail loads in the player, but on clicking play, the player goes to the onError function with YouTubePlayer.ErrorReason.INTERNAL_ERROR. A message is displayed saying "There was a problem while playing. Tap to retry". Playing these videos on the YouTube website or our iOS app does not have a problem. The original sample videos play fine with my developer key.

I am experiencing this issue on multiple devices, including my Nexus 5X (android 6.0.1) with YouTube app version currently at 11.13.56.

Has anyone else experienced a similar issue?

I have also posted a potential bug report on google data api issue tracker.

Upvotes: 7

Views: 2026

Answers (2)

batistomorrow
batistomorrow

Reputation: 674

The WebView seems to be a good solution. Because I was in a rush and needed a quick fix, I used the source code from this github project :

https://github.com/theScrabi/NewPipe

This code does not rely on the Youtube API. It is pure web parsing. All my videos are working fine with the solution, as fast as before.

The whole project is a functional app, but you can dive inside and take what you need. I used the fragment which embeds the video thumbnail and the fullscreen player activity.

Kudos to the author of the project.

Upvotes: 2

frabbe
frabbe

Reputation: 111

It seems to be a YouTube bug, view YouTubeAndroidPlayerAPI can't play some videos for details that I collected.

the only passable workaround at this time appears to be open the video in the YouTube official app with an intent or replace the player fragment with a WebView. I preferred this second solution.

The standard WebView is very limited and will not show the button to bring the video fullscreen. You need to create a class that extend 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);
        }
    }
}

and then initialize the 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);

Finally, load the video in the WebView:

myWebView.loadUrl("https://www.youtube.com/embed/"+youtube_id);

If you want to adapt the WebView dimensions to the YouTube player you can do this:

Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
myWebView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int)Math.round(size.x/1.77)));

Upvotes: 0

Related Questions