2013-04-08 21 views
5

Tôi có một đoạn API YouTube được thêm vào tĩnh trong tệp kê khai xml của tôi, tức là một đoạn có trình phát youtube bên trong nó.Làm cách nào để giữ lại trường hợp đoạn đoạn video đang phát sau khi thay đổi hướng?

Tôi không có tệp mở rộng đoạn trong dự án của mình.

Trong lớp hoạt động của tôi, tôi đặt dòng mã này trong onCreate của lớp hoạt động của tôi:

youTubePlayerFragment.setRetainInstance(true); 

Nó không có bất kỳ ảnh hưởng đến: khi tôi xoay màn hình tôi nhận được một màn hình màu đen trống của đoạn .

Tôi làm cách nào để tiếp tục phát đoạn sau khi thay đổi hướng?

<fragment 
     android:id="@+id/youtube_fragment" 
     android:name="com.google.android.youtube.player.YouTubePlayerFragment" 
     android:layout_width="900dp" 
     android:layout_height="500dp" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" /> 

Trả lời

3

Các giải pháp nhanh chóng và dễ dàng là để thêm dòng sau vào hoạt động video của bạn, trong biểu hiện của bạn:

android:configChanges="orientation|keyboard|keyboardHidden|screenSize" 

Tôi có một ứng dụng có sử dụng điều này trong một video và nó hoạt động tốt. Tất cả mọi thứ đưa ra đúng về sự thay đổi định hướng, và các hoạt động và mảnh vỡ dụ không bị xé xuống cho phép nó liên tục tiếp tục chơi.

Nếu bạn muốn hoạt động bị rách/tái tạo, trong khi vẫn giữ lại phân đoạn đoạn, vui lòng đọc lại tài liệu cho setRetainInstance(). Có một số sắc thái tinh tế mà bạn cần phải biết để làm cho nó hoạt động đúng: http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

2

Mỗi lần định hướng thay đổi hoạt động sẽ được tạo lại miễn là với tất cả các thành phần con. Bây giờ phần quan trọng là, YouTubePlayer.Provider sẽ giữ các giai đoạn của nó (chẳng hạn như: video đã tải, vị trí phát lại hiện tại và cấu hình trình phát). Hãy nhìn vào những điều sau đây:

YouTubePlayer Overview

Trong trường hợp của bạn, sau khi thay đổi định hướng, hoạt động này được tái tạo càng lâu càng đoạn con của nó (youTubePlayerFragment). Vì vậy, bạn đã mất tham chiếu về ngay lập tức của YouTubePlayer và dữ liệu (chẳng hạn như videoID hoặc url video) cần thiết để tải video, nhưng nhà cung cấp YouTubePlayer vẫn đang giữ trạng thái trước đó, trở thành vô hiệu sau khi xoay vòng.

Giải pháp: bạn thực sự cần quản lý cách lưu dữ liệu cần thiết để phát video trên YouTubePlayer trước khi thiết bị thay đổi hướng và để lấy lại dữ liệu khi hoạt động được tạo lại. Hãy nhìn vào những điều sau đây:

YouTubePlayerFragment Overview

Không chắc về cấu trúc mã của bạn, nhưng hy vọng các mã sau đây sẽ cung cấp cho bạn một số ý tưởng:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString("currentVideoID",videoID); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    videoID = savedInstanceState.getString("currentVideoID"); 
} 

Một mẫu để có được những video chơi trên YouTubePlayer

private void loadYouTubePlayer(){ 
    //load your youTubePlayerFragment here, i used YouTubePlayerSupportFragment(),may change in your case 
    //also you may not need to call getActivity(). Change the code as require 
    youTubePlayerFragment = (YouTubePlayerSupportFragment)getActivity().getSupportFragmentManager().findFragmentById(R.id.youtube_fragment); 
    youTubePlayerFragment.initialize(developerKey,new YouTubePlayer.OnInitializedListener() { 
     @Override 
     public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) { 
      myYouTubePlayer = youTubePlayer; 
      myYouTubePlayer.setFullscreenControlFlags(YouTubePlayer.FULLSCREEN_FLAG_CONTROL_ORIENTATION | YouTubePlayer.FULLSCREEN_FLAG_ALWAYS_FULLSCREEN_IN_LANDSCAPE); 
      myYouTubePlayer.setOnFullscreenListener(new YouTubePlayer.OnFullscreenListener() { 
       @Override 
       public void onFullscreen(boolean b) { 
        isFullScreenPlaying = b; 
        Log.d(null,"Now fullScreen"); 
       } 
      }); 
      if (!b) { 
       myYouTubePlayer.loadVideo(videoID); 
      } 
     } 

     @Override 
     public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) { 
     Log.e(null,"Initialization Failed !!!"); 
     } 
    }); 
} 
Các vấn đề liên quan