适用于多个视频的YouTube Android播放器API INTERNAL_ERROR

时间:2016-05-04 10:20:21

标签: android youtube android-youtube-api

使用YouTube Android Player API sample code(版本1.2.2),如果我将任何视频ID更改为我已上传的视频ID(例如" QVikru_w2hQ"或" u1n6E81rm80" ),缩略图在播放器中加载,但在点击播放时,播放器使用YouTubePlayer.ErrorReason.INTERNAL_ERROR进入onError功能。将显示一条消息,说明"播放时出现问题。点按即可重试"。在YouTube网站或我们的iOS应用上播放这些视频没有问题。原始示例视频可以与我的开发人员密钥一起使用。

我在多个设备上遇到此问题,包括我的Nexus 5X(Android 6.0.1),其YouTube应用版本目前为11.13.56。

还有其他人遇到类似问题吗?

我还在google data api issue tracker上发布了潜在的错误报告。

2 个答案:

答案 0 :(得分:2)

WebView似乎是一个很好的解决方案。因为我很急,需要快速修复,我使用了这个github项目的源代码:

https://github.com/theScrabi/NewPipe

此代码不依赖于Youtube API。它是纯粹的Web解析。我的所有视频都能像以前一样快速地使用该解决方案。

整个项目是一个功能性的应用程序,但你可以在里面潜水,并采取你需要的。我使用了嵌入视频缩略图和全屏播放器活动的片段。

赞赏该项目的作者。

答案 1 :(得分:0)

这似乎是一个YouTube错误,请查看YouTubeAndroidPlayerAPI can't play some videos以了解我收集的详细信息。

此时唯一可通过的解决方法似乎是打开YouTube官方应用中的视频,或者用WebView替换播放器片段。我更喜欢第二种解决方案。

标准WebView非常有限,不会显示将视频全屏显示的按钮。您需要创建一个扩展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);
        }
    }
}

然后初始化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);

最后,在WebView中加载视频:

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

如果您想要将WebView维度调整为YouTube播放器,您可以执行以下操作:

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