2017-06-08 17 views
0

今、私はYouTubePlayerSupportFragmentを使用してViewPagerの断片でYoutubeビデオを再生しようとしています。 SmartFragmentStatePagerAdapterをビューポートアダプタとして使用しています。 このエラーが発生しました:ViewPager、AndroidのフラグメントでYoutubeビデオを再生する方法

W/YouTubeAndroidPlayerAPI:プレーヤーの上に不正なオーバーレイが原因でYouTube動画の再生が停止しました。 YouTubePlayerViewは、その祖先の中には含まれていません。android.support.v4.view.ViewPager {41a53898 VFED .... ......。 0,84-480,730#7f0c00b8 app:id/viewPager}。祖先のエッジとYouTubePlayerViewの距離は、左:480、上:0、右:-480、下:376(これらはすべて正である必要があります)です。

どうすればこの問題を解決できますか。 よろしく

これはFragmentPageAdapterコード

public class VideoPagerAdapter extends SmartFragmentStatePagerAdapter 

{ 
    private UserInfo usrInfo; 

public VideoPagerAdapter(FragmentManager fragmentManager, UserInfo userInfo){ 
    super(fragmentManager); 
    usrInfo = userInfo; 
} 

@Override 
public Fragment getItem(int position) { 
    VideoDetailFragment videoDetailFragment = new VideoDetailFragment(); 
    videoDetailFragment.video = usrInfo.videoList.get(position); 
    return videoDetailFragment; 
} 

@Override 
public int getCount() { 
    return usrInfo.videoList.size(); 
} 

}

あり、IはVideoDetailFragmentのコードを実装しています。

private YouTubePlayer mYoutubePlayer; 
private YouTubePlayerSupportFragment mYoutubeFragment; 

private void initYoutubeVideo(){ 
    mYoutubeFragment = YouTubePlayerSupportFragment.newInstance(); 
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
    transaction.replace(R.id.youtube_layout, mYoutubeFragment).commit(); 

    mYoutubeFragment.initialize(DEVELOPER_KEY, this); 
} 

@Override 
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) { 
    mYoutubePlayer = youTubePlayer; 
    if (!b){ 
     youTubePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT); 
     youTubePlayer.loadVideo(VIDEO_ID); 
    } 
} 



@Override 
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) { 
    Log.d(TAG, "*** Youtube Player error : " + youTubeInitializationResult.toString()); 
    String errorMessage = String.format(getString(R.string.error_youtube_player), youTubeInitializationResult.toString()); 

    Utils.showAlert(mActivity, errorMessage); 
} 

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 

    if (!isVisibleToUser && mYoutubePlayer != null) { 
     mYoutubePlayer.release(); 
    } 
    if (isVisibleToUser && mYoutubeFragment != null) { 
     mYoutubeFragment.initialize(DEVELOPER_KEY, this); 
    } 
} 

と私はこれは、Android Studioのログです

06-08 19:02:47.012 2562-2562/com.videofeed.tickit W/YouTubeAndroidPlayerAPI: Cannot load modern controls UI. Upgrade to the latest version of the Android YouTube API. 
06-08 19:02:47.082 2562-2562/com.videofeed.tickit D/dalvikvm: DexOpt: couldn't find field Landroid/view/accessibility/CaptioningManager$CaptionStyle;.windowColor 
06-08 19:02:47.082 2562-2562/com.videofeed.tickit W/dalvikvm: VFY: unable to resolve instance field 10579 
06-08 19:02:47.082 2562-2562/com.videofeed.tickit D/dalvikvm: VFY: replacing opcode 0x52 at 0x0019 
06-08 19:02:47.082 2562-2562/com.videofeed.tickit W/YouTubeAndroidPlayerAPI: Forcefully created overlay:[email protected] helper:[email protected] view:null status: ...... {...} 
06-08 19:02:47.372 2562-2562/com.videofeed.tickit W/YouTubeAndroidPlayerAPI: Cannot load modern controls UI. Upgrade to the latest version of the Android YouTube API. 
06-08 19:02:47.442 2562-2562/com.videofeed.tickit W/YouTubeAndroidPlayerAPI: Forcefully created overlay:[email protected] helper:[email protected] view:null status: ...... {...} 
06-08 19:02:47.462 2562-2562/com.videofeed.tickit I/Choreographer: Skipped 40 frames! The application may be doing too much work on its main thread. 
06-08 19:02:47.602 2562-2562/com.videofeed.tickit W/YouTubeAndroidPlayerAPI: Cannot load modern controls UI. Upgrade to the latest version of the Android YouTube API. 
06-08 19:02:47.692 2562-2562/com.videofeed.tickit W/YouTubeAndroidPlayerAPI: Forcefully created overlay:[email protected] helper:[email protected] view:null status: ...... {...} 
06-08 19:02:51.912 2562-2604/com.videofeed.tickit D/dalvikvm: GC_FOR_ALLOC freed 15971K, 69% free 7899K/25052K, paused 35ms, total 37ms 
06-08 19:02:58.202 2562-2562/com.videofeed.tickit W/YouTubeAndroidPlayerAPI: YouTube video playback stopped due to unauthorized overlay on top of player. The YouTubePlayerView is not contained inside its ancestor android.support.v4.view.ViewPager{42c4a610 VFED.... ......ID 0,84-480,730 #7f0c00b8 app:id/viewPager}. The distances between the ancestor's edges and that of the YouTubePlayerView is: left: -480, top: 0, right: 480, bottom: 376 (these should all be positive). 
06-08 19:02:58.222 2562-2562/com.videofeed.tickit W/YouTubeAndroidPlayerAPI: YouTube video playback stopped due to unauthorized overlay on top of player. The YouTubePlayerView is not contained inside its ancestor android.support.v4.view.ViewPager{42c4a610 VFED.... ......ID 0,84-480,730 #7f0c00b8 app:id/viewPager}. The distances between the ancestor's edges and that of the YouTubePlayerView is: left: 480, top: 0, right: -480, bottom: 376 (these should all be positive). 

実際のデバイスでそれをテストしています。 スクリーンショットを添付しました。 This is the screenshot

+0

あなたが受け取ったエラーを明確に記述し、あなたが書いたコードを投稿してください。さらに、このエラーがシミュレータまたはデバイスとAndroidバージョンで発生しているかどうかを指定します。 –

+0

https://developers.google.com/youtube/ – RonTLV

+0

viewpagerを使用して複数の動画を再生しようとしています。上記コードを使用して –

答えて

0

この回答は遅れている可能性がありますが、解決策が見つかりました。

私は同様の問題に遭遇しています。また、ビューページで複数の動画を再生しようとしています。 そこviewpagerで唯一ユーチューブフラグメントがだし、それは大丈夫ですが、1、より多くのがあります場合は、ビデオの再生、および

YouTubeの動画を再生する場合、プレーヤーの上に不正なオーバーレイが原因で停止したというエラーメッセージが表示されない場合。

まず「不正なオーバレイは、」ビューのページャの 見えるページ上にある私の現在の断片から来ていません。ビューページャが現在のフラグメントに"next"を作成するページから来ます。彼らは可視ウィンドウへのスライドがある前に

ビューページャは、ページを作成し、それが見える前にユーチューブフラグメントが作成され、そしてあなたはフラグメントが、その後、ユーチューブプレイヤーはその奇妙なオーバーレイエラーを検出し、ビデオを停止を初期化場合、およびYouTubeのプレイヤーは、表示されているページに通常表示されているビデオを停止することもできます。

あなたのケースでは、エラーメッセージ

を見ることができます左:480、トップ:0、右:-480、下:負の数は、広い窓である376

を、それは私が得た問題と同じ確率です。

だから私のソリューション

1.(のonCreateでユーチューブを初期化No't)そのフラグメントはviewpagerの見える前に、初期化を行いません。

私のケースでは、アダプターとフラグメントの間のインターフェースを使用し、ビューページの親ページでは、ビューページにOnPageChangeListenerを追加します.YouTubeフラグメントはビューページのページがそのYouTubeフラグメントに変更された後にのみ初期化されます。

ページ変更>アダプタを通知>インターフェース> youtubefragment>最初のステップの後

を初期化開始、最初のビデオは2以上のユーチューブフラグメントがviewpagerにあります場合でも正常に再生する必要がありますが、私は2ページ目にスワイプするときユーチューブフラグメントは、ビューページャの見えない部分へのスライドは、第二のビデオnの

理由であるとき、ビデオが再生し、同じエラーを表示し、その第二ステップへ

2.リリースユーチューブプレイヤーを移動しません再生は同じです。最初のページにはyoutubeplayerがあり、それには可視範囲があります。エラーメッセージが表示されます。その理由はわかりません。

私は、ページが変更されたときに同じインターフェースを使用します。アダプタはインターフェイスを使用してスライドを外しているyoutubeフラグメントを通知し、youtubeplayerを解放して、このようなインターフェイスを実装します。このmPlayerは、initializeメソッドによってyoutubeplayerから返されます。他の人に影響を与えるだろう、なぜyoutubeplayer 1つのポケベルのように私は答えることができないいくつかの質問がまだあります

 mInitializeListener = new InitializeListener() { 
     @Override 
     public void startVideo() { 
      initialize(); 
     } 

     @Override 
     public void stopVideo() { 
       mPlayer.release(); 
     } 
    }; 

、 ..?

が、私は私のアダプターおよびフラグメントでの変更をしたとき、 ユーチューブの動画を正常に再生することができますが、これはあなたが以下の

が、私は私のアプリ

MediaFragmentViewPager adapter = 
     new MediaFragmentViewPager(getChildFragmentManager(), getActivity(), true); 
List<MediaData> mediaDataList = new ArrayList<>(); 

adapter.setmResources(mediaDataList); 

imageViewPager.setAdapter(adapter); 

ViewPager.OnPageChangeListener pagerchangeListener = new ViewPager.OnPageChangeListener() { 
    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

    } 
    @Override 
    public void onPageSelected(int position) { 
     adapter.onPageChanged(position); 
    } 
    @Override 
    public void onPageScrollStateChanged(int state) { 

    } 
}; 

imageViewPager.addOnPageChangeListener(pagerchangeListener); 
pagerchangeListener.onPageSelected(0); 

circlePageIndicator.setFillColor(getResources().getColor(R.color.colorAccent)); 
circlePageIndicator.setViewPager(imageViewPager); 

アダプタ

に使うコードです役に立てば幸い
public class MediaFragmentViewPager extends FragmentStatePagerAdapter 
     implements MediaYoutubeFragment.MediaFullScreenListener { 

    protected List<MediaData> mResources; 
    private String apiKey = "your apiKey"; 
    protected Map<Integer, MediaYoutubeFragment.InitializeListener> listenerMap = new HashMap<>(); 
    private Context context; 

    private boolean isFullScreen; 

    public MediaFragmentViewPager(FragmentManager fm, Context context, boolean isFullScreen) { 
     super(fm); 
     this.context = context; 
     this.isFullScreen = isFullScreen; 
    } 

    public int currentPosition = -1; 


    @Override 
    public void startFullScreen() { 
     if (!isFullScreen){ 
      MediaViewPagerActivity.startActivity(context, itemID, companyId, currentPosition); 
     } 
    } 

    @Override 
    public Fragment getItem(int position) { 

     if(mResources.get(position).isImage == true){ 
      Log.i("tag3", "getItem image" + String.valueOf(position)); 
      MediaImageFragment imageFragment = new MediaImageFragment(); 
      imageFragment.setImageUrl(mResources.get(position).getImageResource().getImage1080p()); 
      return imageFragment; 
     } else { 
      Log.i("tag3", "getItem video" + String.valueOf(position)); 
      MediaYoutubeFragment youTubePlayerSupportFragment = 
        MediaYoutubeFragment.newInstance(mResources.get(position).getYoutubeUrl(), this); 
      listenerMap.put(position, youTubePlayerSupportFragment.getmInitializeListener()); 
      return youTubePlayerSupportFragment; 
     } 
    } 

    public void onPageChanged(int position){ 
     // current page it not null, realse youtubeplayer. 
     if(currentPosition != -1){ 
      if(listenerMap.get(currentPosition) != null){ 
       listenerMap.get(currentPosition).stopVideo(); 
      } 
     } 
     // update current position 
     currentPosition = position; 
     Log.i("tag3", "onPageSelected " + String.valueOf(position)); 

     //start loading video 
     MediaYoutubeFragment.InitializeListener listener = listenerMap.get(position); 
     if(listener != null){ 
      Log.i("tag3", "startVideo " + String.valueOf(position)); 
      listener.startVideo(); 
     } else { 
      Log.i("tag3", "startVideo listener is null " + String.valueOf(position)); 
     } 
    } 

    @Override 
    public int getCount() { 
     return mResources.size(); 
    } 

    public List<MediaData> getmResources() { 
     return mResources; 
    } 

    public void setmResources(List<MediaData> mResources) { 
     this.mResources = mResources; 
    } 


} 

ユーチューブフラグメント

public class MediaYoutubeFragment extends YouTubePlayerSupportFragment 
     implements YouTubePlayer.OnInitializedListener, YouTubePlayer.OnFullscreenListener { 
    private static final String KEY_VIDEO_ID = "VIDEO_ID"; 

    public String apiKey = "yor apiKey"; 
    private String mVideoId; 
    private YouTubePlayer mPlayer; 
    boolean mIsFullScreen; 
    private InitializeListener mInitializeListener; 
    private MediaFullScreenListener fullScreenListener; 

    public InitializeListener getmInitializeListener() { 
     return mInitializeListener; 
    } 

    public void setmInitializeListener(InitializeListener mInitializeListener) { 
     this.mInitializeListener = mInitializeListener; 
    } 

    public void setFullScreenListener(MediaFullScreenListener fullScreenListener) { 
     this.fullScreenListener = fullScreenListener; 
    } 

    public interface MediaFullScreenListener{ 
     void startFullScreen(); 
    } 

    public interface InitializeListener{ 
     void startVideo(); 
     void stopVideo(); 
    } 

    public MediaYoutubeFragment(){ 
     super(); 
     mInitializeListener = new InitializeListener() { 
      @Override 
      public void startVideo() { 
       initialize(); 
      } 

      @Override 
      public void stopVideo() { 
       if (mPlayer != null){ 
        mPlayer.release(); 
       } 
      } 
     }; 
    } 

    private void initialize() { 
     initialize(apiKey, this); 
    } 

    public static MediaYoutubeFragment newInstance(String videoId, MediaFullScreenListener listener) { 
     MediaYoutubeFragment frag = new MediaYoutubeFragment(); 

     Bundle args = new Bundle(); 
     args.putString(KEY_VIDEO_ID, videoId); 

     frag.setArguments(args); 
     frag.setFullScreenListener(listener); 
     return frag; 
    } 

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

     if (getArguments() != null) { 
      mVideoId = getArguments().getString(KEY_VIDEO_ID); 
     } 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
    } 

    @Override 
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) { 
     mPlayer = youTubePlayer; 

     mPlayer.setFullscreenControlFlags(FULLSCREEN_FLAG_CUSTOM_LAYOUT); 
     mPlayer.setOnFullscreenListener(this); 
     mPlayer.setFullscreen(false); 
     mPlayer.setShowFullscreenButton(true); 

     if (!wasRestored) { 
      // load your video 
      mPlayer.loadVideo(mVideoId); 
     } 
     else 
     { 
      mPlayer.play(); 
     } 
    } 

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

    } 

    @Override 
    public void onFullscreen(boolean fullscreen) { 
     Log.i("tag3", "onFullscreen" + String.valueOf(fullscreen)); 
     mPlayer.setFullscreen(false); 
     fullScreenListener.startFullScreen(); 
    } 

} 

私は自分自身の活動でフルスクリーンのイベントも処理します。このビューページのコンテンツはYouTubeビデオだけでなく画像も含んでいますので、無視してください。

私はビューページャーをフラグメントで使用しているので、getChildFragmentMangerを使用していますが、このアダプターもアクティビティーで使用しますが、最初のビデオはビューパーのisloadを初めて再生しません。アダプターのgetItem()の前に呼び出すので、アダプターが最初にロードされた場合(最初のyoutubeページが最初に読み込まれる)、リスナーはgetItemの直後に呼び出され、他の部分はすべて同じです。

+0

私はViewPagerクラスとFragmentを共有してYoutubeビデオを再生できますか? –

+0

私のアプリでいくつかの例を追加します。最初はページコンテンツです。私の例では、別のフラグメントです。このアダプタがアクティビティで使用されている場合、いくつかの変更が必要です。 –

+0

これらのリスナーなしでこれを行う別の方法があります。 setUserVisibleHint(boolean isVisibleToUser)、viewpagerのこのフラグメントのメソッドは、このページがviewpagerで可視かどうかを知ることができるので、アダプタタイプを変更し、ページが変更されるたびにアダプタコールgetItem()を呼び出させ、 IF isVisibleToUserがtrueの場合 –

0

基本的には、ビデオの1つが表示画面外に読み込まれてオーバーレイのエラーが発生するという問題があります。 ビューページャの場合、既に読み込まれたページもビデオを読み込みますが、それらのビデオは画面に表示されずエラーが発生します。

解決策(ビューページ用): 一度に1つのビデオ、つまり再生するビデオを読み込みます。 これは、ページが表示されているときに常に動画を読み込むことで行います。

0

これはできません。 YouTubePlayerViewではYoutubeBaseActivityを拡張する必要があるためです。 YouTubePlayerViewの機能は限られています。

関連する問題