在下面的代码中,我想从 google 的 youtube API for Android 启动一个 YouTubePlayerFragment 对象。但是它只会在我第一次运行应用程序时启动。我无法控制 Google API 的称为 YouTubePlayerFragment 的片段的生命周期,它扩展了片段,并且基本上是一个内部带有 youtube 播放器的片段。
我无法控制这个 youtube 播放器。获取 youtubeplayer 对象并控制播放器生命周期的唯一方法是调用 onInitializationSuccess() 方法,您不能这样做,因为该方法由操作系统调用。这是一个回调方法。
我无法弄清楚为什么我会遇到空指针异常和其他错误的所有这些问题。基本上,我从可见性中删除了视频,然后仅在用户单击 WebView 中的链接后才显示可见的片段,其中 URL 中包含子字符串“youtube”。然后它会将 youtube 片段设置为可见。我想获取 URL 并开始播放该链接上的视频。
如果我尝试片段事务 remove() 和 add() 方法,我会得到空指针并崩溃。
如果我不删除片段。然后下次用户点击 webview 中的 youtube 链接时,它会开始播放与之前的链接中相同的 youtube 视频,而不是刚刚点击的链接。它在之前停止的相同位置开始播放。
我要做的就是杀死这个 youtube API 片段并重新启动一个新片段。
我该如何解决这个问题?
public class MainActivity extends YouTubeFailureRecoveryActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler = new Handler();
storedVideoUrl = "";
playTube = false;
setContentView(R.layout.fragments_demo);
pageView = (WebView) findViewById(R.id.webView1);
coverImage = (ImageView) findViewById(R.id.imageView1);
findViewById(R.id.youtube_fragment).setVisibility(View.INVISIBLE);
youTubePlayerFragment = (YouTubePlayerFragment)
getFragmentManager().findFragmentById(R.id.youtube_fragment);
youTubePlayerFragment.initialize(DeveloperKey.DEVELOPER_KEY, MainActivity.this);
coverImage.setVisibility(View.INVISIBLE);
pageView.loadUrl("http://www.example.com/");
WebSettings webSettings = pageView.getSettings();
//ebSettings.setJavaScriptEnabled(true);
WebViewClient mWebClient = new WebViewClient()
{
// Override page so it's load on my view only
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
storedVideoUrl = url;
playTube = true;
if ( url.contains("youtube") == true ){
// Load new URL Don't override URL Link
videoRoot = youTubePlayerFragment.getView();
videoUrl = url.substring(29, 40);
coverImage.setVisibility(View.VISIBLE);
videoRoot = youTubePlayerFragment.getView();
if(videoRoot==null){
videoRoot.setVisibility(View.INVISIBLE);
}else{
videoRoot.setVisibility(View.VISIBLE);
}
return true;
} else{
coverImage.setVisibility(View.INVISIBLE);
// Return true to override url loading (In this case do nothing).
return false;
// if return is true, do nothing. don't load url
}
}
};
pageView.setWebViewClient(mWebClient);
} // end onCreate
public YouTubePlayer.Provider getPlayer() {
return player;
}
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player,
boolean wasRestored) {
if (!wasRestored) {
player.loadVideo("videoUrl");
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK)
{
if (pageView.canGoBack()){
if((videoRoot.getVisibility())==View.VISIBLE){
coverImage.setVisibility(View.INVISIBLE);
videoRoot.setVisibility(View.INVISIBLE);
return true;
}else {
pageView.goBack();
return true;
}
}
}
return super.onKeyDown(keyCode, event);
}
@Override
protected Provider getYouTubePlayerProvider() {
// TODO Auto-generated method stub
return null;
}
} // end fragment demo activity