2014-12-20 8 views
26

sto usando YouTubePlayerAPI e YouTubePlayerSupportFragment nella mia app e sto ottenendo il seguente errore, ma non ho potuto scoprire quali sono le cause . Ho cercato informazioni ma non ho trovato nulla di utile.java.lang.IllegalStateException: YouTubeServiceEntity non inizializzato errore quando si utilizza YouTubePlayerApi

java.lang.IllegalStateException: YouTubeServiceEntity not initialized 
    at android.os.Parcel.readException(Parcel.java:1433) 
    at android.os.Parcel.readException(Parcel.java:1379) 
    at com.google.android.youtube.player.internal.l$a$a.a(Unknown Source) 
    at com.google.android.youtube.player.internal.o.a(Unknown Source) 
    at com.google.android.youtube.player.internal.ad.a(Unknown Source) 
    at com.google.android.youtube.player.YouTubePlayerView.a(Unknown Source) 
    at com.google.android.youtube.player.YouTubePlayerView$1.a(Unknown Source) 
    at com.google.android.youtube.player.internal.r.g(Unknown Source) 
    at com.google.android.youtube.player.internal.r$c.a(Unknown Source) 
    at com.google.android.youtube.player.internal.r$b.a(Unknown Source) 
    at com.google.android.youtube.player.internal.r$a.handleMessage(Unknown Source) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5041) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
    at dalvik.system.NativeStart.main(Native Method) 

Nello stackstrace non c'è alcun numero di riga che punta a nessuna delle mie classi o attività.

Qualche idea?

Grazie!

EDIT

mia abitudine YoutubePlayerFragment Classe: YouTubeVideoPlayerFragment.java

public class YouTubeVideoPlayerFragment extends YouTubePlayerSupportFragment { 


private static final String ARG_URL = "url"; 


// =========================================================== 
// Constructors 
// =========================================================== 

/** 
* Mandatory empty constructor for the fragment manager to instantiate the 
* fragment (e.g. upon screen orientation changes). 
*/ 
public YouTubeVideoPlayerFragment() { 
} 

/** 
* Factory method to generate a new instance of the fragment given a video URL. 
* 
* @param url The video url this fragment represents 
* @return A new instance of this fragment with itemId extras 
*/ 
public static YouTubeVideoPlayerFragment newInstance(String url) { 
    final YouTubeVideoPlayerFragment mFragment = new YouTubeVideoPlayerFragment(); 

    // Set up extras 
    final Bundle args = new Bundle(); 
    args.putString(ARG_URL, url); 
    mFragment.setArguments(args); 

    // Initialize YouTubePlayer 
    mFragment.init(); 

    return mFragment; 
} 



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

} 

private void init(){ 
    initialize(Constants.API_KEY, new YouTubePlayer.OnInitializedListener() { 
     @Override 
     public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) { 
      if (!wasRestored) { 
       youTubePlayer.cueVideo(getArguments().getString(ARG_URL)); 
       youTubePlayer.setShowFullscreenButton(false); 
      } 
    } 
} 

fragment.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:background="@color/black" > 

    <!-- For YoutubeFragment --> 
    <FrameLayout 
     android:id="@+id/youtube_fragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</RelativeLayout> 

metodo chiamando:

// Create a new instance of YouTubeVideoPlayerFragment providing video id 
     // and place it in the corresponding FrameLayout 
     final YouTubeVideoPlayerFragment youTubeVideoPlayerFragment = YouTubeVideoPlayerFragment.newInstance(VIDEO_ID); 
     final FragmentTransaction ft = getChildFragmentManager().beginTransaction(); 
     ft.replace(R.id.youtube_fragment, youTubeVideoPlayerFragment); 
     ft.commit(); 

EDIT

ho scoperto l'origine di tale errore. Questo è lo scenario:

L'attività ha inizio. In onCreate() crea un nuovo YouTubeVideoPlayerFragment e inizializza l'oggetto YouTube (che avvia internamente lo YouTubeServiceEntity) nel suo metodo newInstance(). Quindi il frammento YouTube che è stato istanziato prima, viene allegato con FragmentManager allo FrameLayout corrispondente durante il caricamento del video.

Ecco il problema: Se l'utente chiude l'attività prima del caricamento del video, viene generata l'eccezione.

Quindi, se l'utente desidera uscire dall'attività in quel caso, cosa devo fare e come? Non so davvero cosa fare!

+1

è possibile mostrare il codice in cui è stata inizializzata YouTubeServiceEntity –

+0

cura con il codice di @Zoya – GmloMalo

+0

dispiace, ma io sono ancora in grado di trova l'inizializzazione di YouTubeServiceEntity. e il tuo logcat riporta anche lo stesso problema –

risposta

0

Ancora una volta, NON utilizzare costruttori di frammenti o metodi di fabbrica per lavorare con le entità del ciclo di vita o con il contesto. In poche parole, tali entità possono essere utilizzate solo dopo che è stato chiamato il numero super.onCreate(...).

La domanda ora è, quando chiamare il metodo init?

Ecco cosa YouTubePlayerFragment documentation dice:

La YouTubePlayer associata a questo frammento verrà rilasciato ogni volta che il suo metodo onDestroyView() viene chiamato. Dovrai quindi richiamare nuovamente initialize(String, YouTubePlayer.OnInitializedListener) ogni volta che l'attività associata a questo frammento viene ricreata, anche se l'istanza del frammento viene mantenuta attraverso la ricreazione dell'attività impostando setRetainInstance(boolean).

si può essere tentati di mettere in init()onActivityCreated ma è troppo tardi, dal momento che è già stata chiesta onStart e il layout già eseguito.

La controparte di onDestroyView è onViewCreated e questo è il candidato perfetto.

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    init(); 
} 

Come suggerito chiamare setRetainInstance(true) nel costruttore del frammento. Quando l'attività viene ricreata, il frammento non verrà ricreato, solo la sua interfaccia utente passerà attraverso gli eventi del ciclo di vita.

0

Il problema è l'inizializzazione del frammento di Youtube. YouTubePlayerSupportFragment deve essere esteso in una tua classe e sovrascrive alcuni metodi. Devi controllare l'orientamento dello schermo e l'onSaveInstanceState.

public class YouTubePlayerFragment extends YouTubePlayerSupportFragment { 

    private YouTubePlayer mPlayer; 

    public static YouTubePlayerFragment newInstance() { 
    return new YouTubePlayerFragment(); 
    } 

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

    setRetainInstance(true); 
    } 

    @Override 
    public void initialize(String s, YouTubePlayer.OnInitializedListener onInitializedListener) { 
    super.initialize(s, new YouTubePlayer.OnInitializedListener() { 
     @Override public void onInitializationSuccess(YouTubePlayer.Provider provider, 
     YouTubePlayer youTubePlayer, boolean b) { 

     mPlayer = youTubePlayer; 

     onInitializedListener.onInitializationSuccess(provider, youTubePlayer, b); 
     } 

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

     onInitializedListener.onInitializationFailure(provider, youTubeInitializationResult); 
     } 
    }); 
    } 

    @Override public void onDestroyView() { 
    if (mPlayer != null) { 

     mPlayer.release(); 
    } 
    super.onDestroyView(); 
    } 

    public YouTubePlayer getPlayer() { 
    return mPlayer; 
    } 
} 

YoutubeFragment.class

 public class YoutubeFragment extends Fragment { 

    private static final String EXTRA_PLAYED_VIDEO = "EXTRA_PLAYED_VIDEO"; 
    private static final String EXTRA_IS_PLAYING = "EXTRA_IS_PLAYING"; 
    private static final String YOUTUBE_FRAGMENT = "YOUTUBE_FRAGMENT"; 
    private static final String EXTRA_YOUTUBE_ID = "EXTRA_YOUTUBE_ID"; 

    private RelativeLayout youtubeLayoutContainer; 

    private String youtubeId; 
    private int playedVideo; 
    private boolean isPlaying; 

    YouTubePlayer.OnInitializedListener onInitializedListener = 
     new YouTubePlayer.OnInitializedListener() { 

      @Override 
      public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, 
       boolean wasRestored) { 

      if (!wasRestored) { 
       setYouTubePlayer(player); 
      } 
      } 

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

    public static YoutubeFragment newInstance(String youtubeId) { 
     YoutubeFragment youtubeElements = new YoutubeFragment(); 

     Bundle bundle = new Bundle(); 
     bundle.putString(EXTRA_YOUTUBE_ID, youtubeId); 
     youtubeElements.setArguments(bundle); 

     return youtubeElements; 
    } 

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

     setRetainInstance(true); 
    } 

    @Nullable @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
     @Nullable Bundle savedInstanceState) { 

     View mView = inflater.inflate(R.layout.view_youtube_elements_item, container, false); 

     initViews(mView); 

     initYoutubeFragment(); 

     return mView; 
    } 

    private void initViews(View view) { 
     youtubeLayoutContainer = (RelativeLayout) view.findViewById(R.id.youtubeLayoutContainer); 

     youtubeLayoutContainer.getViewTreeObserver() 
      .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @Override public void onGlobalLayout() { 
       FrameLayout.LayoutParams lp = 
        new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, 
         FrameLayout.LayoutParams.MATCH_PARENT); 

       youtubeLayoutContainer.setLayoutParams(lp); 
       if (AndroidSdkVersion.hasJellyBean16()) { 
       youtubeLayoutContainer.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
       } 
      } 
      }); 
    } 

    private void initYoutubeFragment() { 
     try { 
     YouTubePlayerFragment youTubePlayerFragment2 = YouTubePlayerFragment.newInstance(); 
     youTubePlayerFragment2.initialize(BuildConfig.YOUTUBE_DEVELOPER_KEY, onInitializedListener); 

     if (this.getActivity() != null && !this.getActivity().isFinishing()) { 
      getChildFragmentManager().beginTransaction() 
       .replace(R.id.youtubePlayerFragmentContent, youTubePlayerFragment2, YOUTUBE_FRAGMENT) 
       .commitAllowingStateLoss(); 
     } 
     } catch (Exception ignored) { 
     } 
    } 

    public void setYouTubePlayer(final YouTubePlayer player) { 
     try { 
     if (player == null) { 
      return; 
     } 

     player.setShowFullscreenButton(true); 
     player.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT); 

     if (playedVideo >= 0) { 
      if (playedVideo == 0 || isPlaying) { 
      player.loadVideo(youtubeId, playedVideo); 
      } else { 
      player.cueVideo(youtubeId, playedVideo); 
      } 
     } 
     } catch (Exception ignored) { 
     } 
    } 

    @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     if (savedInstanceState != null) { 
     playedVideo = savedInstanceState.getInt(EXTRA_PLAYED_VIDEO); 
     isPlaying = savedInstanceState.getBoolean(EXTRA_IS_PLAYING); 
     } 
    } 

    @Override public void onSaveInstanceState(Bundle outState) { 
     try { 
     YouTubePlayerFragment youTubePlayerSupportFragment = 
      (YouTubePlayerFragment) getChildFragmentManager().findFragmentByTag(YOUTUBE_FRAGMENT); 
     YouTubePlayer mPlayer = youTubePlayerSupportFragment.getPlayer(); 

     if (mPlayer != null) { 
      outState.putInt(EXTRA_PLAYED_VIDEO, mPlayer.getCurrentTimeMillis()); 
      outState.putBoolean(EXTRA_IS_PLAYING, mPlayer.isPlaying()); 
     } 
     } catch (Exception ignored) { 
     } 

     super.onSaveInstanceState(outState); 
    } 
    } 

di attività contenenti Youtube Frammento

public class YoutubeContentDataActivity extends BaseActivity { 

     private static final String EXTRA_YOUTUBE_VIDEO_ID = "EXTRA_YOUTUBE_VIDEO_ID"; 
     private static final String TAG_RETAINED_FRAGMENT = "TAG_RETAINED_FRAGMENT"; 

     public static void open(Context context, String videoId) { 

     Intent intent = new Intent(context, YoutubeContentDataActivity.class); 
     intent.putExtra(EXTRA_YOUTUBE_VIDEO_ID, videoId); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(intent); 
     } 

     @Override public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_youtube_main_container_layout); 

     FragmentManager fm = getSupportFragmentManager(); 
     YoutubeFragment youtubeElementsFragment = 
      (YoutubeFragment) fm.findFragmentByTag(TAG_RETAINED_FRAGMENT); 

     // create the fragment and data the first time 
     if (youtubeElementsFragment == null) { 

      String videoId = getIntent().getStringExtra(EXTRA_YOUTUBE_VIDEO_ID); 
      // videoId = "17uHCHfgs60";//"ikO91fQBsTQ"; 
      youtubeElementsFragment = YoutubeFragment.newInstance(videoId); 
      FragmentManager fragmentManager = getSupportFragmentManager(); 
      fragmentManager.beginTransaction() 
       .replace(R.id.youtube_main_container, youtubeElementsFragment, TAG_RETAINED_FRAGMENT) 
       .commit(); 
     } 
     } 

     @Override public void onPause() { 
     super.onPause(); 

     if (isFinishing()) { 
      FragmentManager fm = getSupportFragmentManager(); 

      YoutubeFragment youtubeElementsFragment = 
       (YoutubeFragment) fm.findFragmentByTag(TAG_RETAINED_FRAGMENT); 

      fm.beginTransaction().remove(youtubeElementsFragment).commit(); 
     } 
     } 
    } 
Problemi correlati