Luchando con el fragmento de la ayuda del jugador de Youtube
Estoy tratando de usar el fragmento de soporte de Youtube Player en un fragmento, pero la aplicación siempre se bloquea (NullPointerException) y no he podido encontrar ningún post similar para solucionarlo.
Tengo import import android.support.v4.app.Fragment para que no debería ser el problema.
- Utilice la API de reproductor de youtube android para establecer la calidad de reproducción de vídeo
- Cómo cargar las miniaturas de Youtube en un RecyclerView utilizando la API de Youtube
- Youtube Obtener la lista de videos subidos. Error FileNotFound
- YouTubePlayerAPI ¿Agenda para la distribución?
- ¿Hay una versión HD (Higher Quality) .3gp de vídeo en youtube para los jugadores de HTML?
Así es como se ve mi clase de fragmento:
package com.example.activitydetector; import com.google.android.youtube.player.YouTubeBaseActivity; import com.google.android.youtube.player.YouTubeInitializationResult; import com.google.android.youtube.player.YouTubePlayer; import com.google.android.youtube.player.YouTubePlayer.OnInitializedListener; import com.google.android.youtube.player.YouTubePlayer.Provider; import com.google.android.youtube.player.YouTubePlayerFragment; import com.google.android.youtube.player.YouTubePlayerSupportFragment; import com.google.android.youtube.player.YouTubePlayerView; import systemManager.SystemManager; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast; public class GuidelinesFragment extends YouTubePlayerSupportFragment { SystemManager sm; YouTubePlayerView youTubeView; String URL_VIDEO = "CaA-k1l0xa4"; String KEY_DEVELOPER = "AIzaSyBIIs0u0NXhsZguv8nCNvSzUmflTt7K1Ek"; public GuidelinesFragment() { super(); // TODO Auto-generated constructor stub } public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.youtube, container, false); YouTubePlayerSupportFragment youTubePlayerSupportFragment = (YouTubePlayerSupportFragment) getFragmentManager().findFragmentById(R.id.youtubeplayerfragment); youTubePlayerSupportFragment.initialize(KEY_DEVELOPER, new OnInitializedListener() { @Override public void onInitializationSuccess(Provider arg0, YouTubePlayer arg1, boolean arg2) { // TODO Auto-generated method stub arg1.cueVideo(URL_VIDEO); } @Override public void onInitializationFailure(Provider arg0, YouTubeInitializationResult arg1) { // TODO Auto-generated method stub } }); return view; } }
Este es mi totalmente y simple "Youtube" de diseño:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <fragment android:name="com.google.android.youtube.player.YouTubePlayerSupportFragment" android:id="@+id/youtubeplayerfragment" android:layout_width="match_parent" android:layout_height="wrap_content"/>
Y este es el error que muestra el registro:
11-30 16:33:56.419: W/dalvikvm(19375): threadid=1: thread exiting with uncaught exception (group=0x40f14258) 11-30 16:33:56.423: E/AndroidRuntime(19375): FATAL EXCEPTION: main 11-30 16:33:56.423: E/AndroidRuntime(19375): java.lang.NullPointerException 11-30 16:33:56.423: E/AndroidRuntime(19375): at com.google.android.youtube.player.YouTubePlayerSupportFragment.onStart(Unknown Source) 11-30 16:33:56.423: E/AndroidRuntime(19375): at android.support.v4.app.Fragment.performStart(Fragment.java:1484) 11-30 16:33:56.423: E/AndroidRuntime(19375): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:941) 11-30 16:33:56.423: E/AndroidRuntime(19375): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 11-30 16:33:56.423: E/AndroidRuntime(19375): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 11-30 16:33:56.423: E/AndroidRuntime(19375): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 11-30 16:33:56.423: E/AndroidRuntime(19375): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429) 11-30 16:33:56.423: E/AndroidRuntime(19375): at android.os.Handler.handleCallback(Handler.java:605) 11-30 16:33:56.423: E/AndroidRuntime(19375): at android.os.Handler.dispatchMessage(Handler.java:92) 11-30 16:33:56.423: E/AndroidRuntime(19375): at android.os.Looper.loop(Looper.java:137) 11-30 16:33:56.423: E/AndroidRuntime(19375): at android.app.ActivityThread.main(ActivityThread.java:4645) 11-30 16:33:56.423: E/AndroidRuntime(19375): at java.lang.reflect.Method.invokeNative(Native Method) 11-30 16:33:56.423: E/AndroidRuntime(19375): at java.lang.reflect.Method.invoke(Method.java:511) 11-30 16:33:56.423: E/AndroidRuntime(19375): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809) 11-30 16:33:56.423: E/AndroidRuntime(19375): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576) 11-30 16:33:56.423: E/AndroidRuntime(19375): at dalvik.system.NativeStart.main(Native Method)
Cualquier ayuda o indicio estaría profundamente agradecido. Ya he perdido alrededor de 4 horas sin suerte.
- Anuncios de Youtube antes del video dirigido
- Sube videos a Youtube mediante programación
- Las incorporaciones de iframe de YouTube no pueden reproducirse automáticamente en Android
- Cómo buscar videos con la API de datos de YouTube en Android
- Haciendo un perfecto reproductor Youtube de Chromeless en Android
- Obtener todas las ID de video de la lista de reproducción de YouTube
- YouTubePlayerView en un ScrollView
- ¿Cómo iniciar la aplicación Youtube para abrir un canal?
Me encontré con este problema antes y creo que el problema se derivó de tratar de inflar el diseño YouTubePlayerSupportFragment
. Resolví mi problema creando un fragmento como este:
public class PlayerYouTubeFrag extends YouTubePlayerSupportFragment { private String currentVideoID = "video_id"; private YouTubePlayer activePlayer; public static PlayerYouTubeFrag newInstance(String url) { PlayerYouTubeFrag playerYouTubeFrag = new PlayerYouTubeFrag(); Bundle bundle = new Bundle(); bundle.putString("url", url); playerYouTubeFrag.setArguments(bundle); return playerYouTubeFrag; } private void init() { initialize(DeveloperKey.DEVELOPER_KEY, new OnInitializedListener() { @Override public void onInitializationFailure(Provider arg0, YouTubeInitializationResult arg1) { } @Override public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) { activePlayer = player; activePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT); if (!wasRestored) { activePlayer.loadVideo(getArguments().getString("url"), 0); } } }); } @Override public void onYouTubeVideoPaused() { activePlayer.pause(); } }
Y luego llamar a una instancia del fragmento como este:
PlayerYouTubeFrag myFragment = PlayerYouTubeFrag.newInstance("video_id"); getSupportFragmentManager().beginTransaction().replace(R.id.video_container, myFragment).commit();
Donde video_container
en mi caso era un diseño de marco vacío.
CzarMatt lo clavó. Sólo para añadir a su respuesta, sin embargo, no olvide que necesita llamar al método init()
. Para ello, siga el código de CzarMatt y añada una línea:
public static PlayerYouTubeFrag newInstance(String url) { PlayerYouTubeFrag playerYouTubeFrag = new PlayerYouTubeFrag(); Bundle bundle = new Bundle(); bundle.putString("url", url); playerYouTubeFrag.setArguments(bundle); playerYouTubeFrag.init(); //This line right here return playerYouTubeFrag; }
Además, ya que estoy seguro de que la gente se encontrará con el mismo problema que hice, a pesar de que CzarMatt lo mencionó anteriormente, sólo para reiterar, cuando se pasa una URL para el video, NO está pasando en la URL de YouTube
Es decir, con: "youtube.com/watch?v=z7PYqhABiSo&feature=youtu.be"
Estás pasando solo el ID de video
Es decir, use: "z7PYqhABiSo"
Dado que es la propia documentación de Google, sabe cómo jugar bien con el ID.
- Android Pluralización no funciona, necesita ayuda
- La notificación del androide no activa el onReceive de BroadcastReceiver