YouTubeAndroidPlayerAPI无法播放一些视频

fra*_*bbe 11 youtube video android android-youtube-api youtube-data-api

- 更新09/05/2016 17:10 - 问题似乎与视频发布日期有关...在4月的最后一周,我在YouTube上发布了很多视频,这些视频发布时间截至4月19日27工作正常,而在同一天21:15收费的人讨论了这个问题,好像在4月27日19日到21日之间,YouTube对视频进行了一些更新或更改.我现在尝试加载一个新视频,这也有同样的问题.


我对YouTubeAndroidPlayerAPI有一个奇怪的问题..我使用YouTubePlayerSupportFragment(但我有与YouTubePlayerFragment相同的问题)在我的应用中播放视频,一些视频播放完美,其他显示错误"播放时出现问题.点击重试. ".

如果在Android Monitor中发生这种情况,我会看到YouTube API错误:

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)
Run Code Online (Sandbox Code Playgroud)

如果我点按视频中的YouTube图标以在YouTube应用中播放,则可以在官方应用中正确播放视频.

如果视频已启用获利功能,则广告视频会正常显示,最后会显示错误.

我试过了:

  • 使用YouTubePlayerFragment代替YouTubePlayerSupportFragment
  • 使用Activity而不是AppCompatActivity
  • 将视频嵌入HTML页面,它可以正常工作
  • 无效的货币化,没有任何变化
  • 不同的密钥,一个用于调试,一个用于发布

非常感谢您的帮助!


更新11/05/2016这似乎是一个YouTube错误; 目前唯一可通过的解决方法似乎是打开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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后初始化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);
Run Code Online (Sandbox Code Playgroud)

最后,在WebView中加载视频:

myWebView.loadUrl("https://www.youtube.com/embed/"+youtube_id);
Run Code Online (Sandbox Code Playgroud)

如果要将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)));
Run Code Online (Sandbox Code Playgroud)

Rio*_*los 0

尝试将您的 YouTube 应用更新至版本 11.19.56。