9

AndroidのYouTube APIサンプルを使用して、アプリでクロムのないYouTubeプレーヤーを作成しています。バッファリング/ロードプログレスバーは、ロードして再生を開始した後もビデオを表示するという問題があります。私は小さな変更のカップルとFragmentDemoActivityサンプルでこれを再現することができます。YouTube Android API:YouTubePlayerFragmentローテーションスピナー

public class FragmentDemoActivity extends AppCompatActivity implements YouTubePlayer.OnInitializedListener { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.fragments_demo); 

     YouTubePlayerFragment youTubePlayerFragment = 
      (YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.youtube_fragment); 
     youTubePlayerFragment.initialize(DeveloperKey.DEVELOPER_KEY, this); 
    } 

    @Override 
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, 
      boolean wasRestored) { 
     if (!wasRestored) { 
      player.setPlayerStyle(YouTubePlayer.PlayerStyle.CHROMELESS); 
      player.loadVideo("nCgQDjiotG0", 10); 
     } 
    } 

    @Override 
    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {} 

} 

ドキュメントは行うことは結構です言うように、私は、AppCompatActivity代わりのYouTubeFailureRecoveryActivityから継承するFragmentDemoActivityを変更しました。私はonInitializationSuccessのクロムレスになるようにプレーヤースタイルを変更しました。最後に、cueVideoloadVideoに変更しました。自動再生を開始するだけです。

これは、Nexus 5Xを含む複数のデバイスで発生します。私はライブラリバージョン1.2.2を使用しています。 onInitializationFailureにエラーは発生しません。

ビデオはバッファリング後に再生を開始します。プレーヤーはクロムレスです。しかし、バッファリングスピナーは決して消えません。これはバグですか、私は何かをしていますか?

+1

これはhttp://stackoverflow.com/questions/35202945/youtubeapi-loader-doesnt-disppearの複製であるようですが、うまくいけば再生可能なビットのコードで作業することができます。 –

答えて

10

私もこれに遭遇しました。本当にバグのようです。ここで私はそれを回避する方法を管理しています。

onInitializationSuccessにはplayerPlaybackEventListenerを設定してください。 YouTubeのコードを変更するだけの場合には

ViewGroup ytView = (ViewGroup)ytPlayerFragment.getView(); 
ProgressBar progressBar; 
try { 
    // As of 2016-02-16, the ProgressBar is at position 0 -> 3 -> 2 in the view tree of the Youtube Player Fragment 
    ViewGroup child1 = (ViewGroup)ytView.getChildAt(0); 
    ViewGroup child2 = (ViewGroup)child1.getChildAt(3); 
    progressBar = (ProgressBar)child2.getChildAt(2); 
} catch (Throwable t) { 
    // As its position may change, we fallback to looking for it 
    progressBar = findProgressBar(ytView); 
    // TODO I recommend reporting this problem so that you can update the code in the try branch: direct access is more efficient than searching for it 
} 

int visibility = isBuffering ? View.VISIBLE : View.INVISIBLE; 
if (progressBar != null) { 
    progressBar.setVisibility(visibility); 
    // Note that you could store the ProgressBar instance somewhere from here, and use that later instead of accessing it again. 
} 

findProgressBar方法、フォールバックとして使用:onBufferingをオーバーライドして、このような何かを

private ProgressBar findProgressBar(View view) { 
    if (view instanceof ProgressBar) { 
     return (ProgressBar)view; 
    } else if (view instanceof ViewGroup) { 
     ViewGroup viewGroup = (ViewGroup)view; 
     for (int i = 0; i < viewGroup.getChildCount(); i++) { 
      ProgressBar res = findProgressBar(viewGroup.getChildAt(i)); 
      if (res != null) return res; 
     } 
    } 
    return null; 
} 

をこのソリューションはProgressBarを有効にする、私のために完全に正常に動作しますプレーヤーがバッファリングしていないときにそれを無効にしているとき。

EDIT:このソリューションを使用して、誰もがこのバグが修正されたことやProgressBarの位置が変更されていることを発見した場合、私は私の答えを編集できるように、感謝を共有してください!

+1

はい!この回避策は私のためのトリックです - 彼らはバグを修正するまで使用します。どうもありがとう! – danwilkie