将YouTube集成到Fragment

34
我的Activity继承另一个Activity并包含导航抽屉,其中每个选项打开一个新的fragment。我想将Youtube集成到其中一个fragment中。以前我使用YouTubePlayerView将Youtube集成到Activity中,但这里需要在Fragment中实现。我在网上搜索并找到了YouTubePlayerFragment可以将Youtube集成到Fragment中。但是当我在教程中搜索时,我发现即使使用YouTubePlayerFragment,我们也会扩展YouTubeBaseActivity。以下是这些示例... http://android-coding.blogspot.in/2013/04/example-to-use-youtubeplayerfragment-of.html http://android-er.blogspot.in/2013/06/example-to-use-youtubeplayerfragment-of.html 我无法理解如何使用YouTubePlayerFragment,使我的类扩展Fragment而不是我的项目所需的YouTubeBaseActivity。正如下面所示,我的类扩展另一个Activity,并包含导航抽屉,在第五个选项中打开YouTube Fragment。我想在此片段内播放Youtube视频。我简要介绍一下我的类布局-
public class LandingActivity extends BaseGActivity {
.
.
.
.


public void selectDrawerItem(int position) {

        Bundle args = new Bundle();

        switch (position) {
            case 0:
                currentFragment = new HomeFragment_();
                args.putString(G.General.MEDIA_TYPE_KEY, G.General.MEDIA_TYPE_ALL);
                GApplication.getInstance().stopGPlayer();
                break;
            case 1:
                currentFragment = new HomeFragment_();
                args.putString(G.General.MEDIA_TYPE_KEY, G.General.MEDIA_TYPE_PHOTO);
                GApplication.getInstance().stopGPlayer();
                break;
//
            case 2:
                currentFragment = new HomeFragment_();
                args.putString(G.General.MEDIA_TYPE_KEY, G.General.MEDIA_TYPE_AUDIO);
                GApplication.getInstance().stopGPlayer();
                break;

            case 3:
                currentFragment = new HomeFragment_();
                args.putString(G.General.MEDIA_TYPE_KEY, G.General.MEDIA_TYPE_VIDEO);
                GApplication.getInstance().stopGPlayer();
                break;
            case 4:
                currentFragment = new HomeFragment_();
                args.putString(G.General.MEDIA_TYPE_KEY, G.General.MEDIA_TYPE_MEME);
                GApplication.getInstance().stopGPlayer();
                break;
            case 5:
                currentFragment = new YoutubeFragment();
            default:
                currentFragment = new HomeFragment_();
                args.putString(G.General.MEDIA_TYPE_KEY, G.General.MEDIA_TYPE_ALL);
                GApplication.getInstance().stopGPlayer();
                break;
        }

        currentFragment.setArguments(args);
        FragmentManager frgManager = getFragmentManager();
        frgManager.beginTransaction().replace(R.id.content_frame, currentFragment)
                .commit();

        mDrawerList.setItemChecked(position, true);
        setTitle(dataList.get(position).getItemName());
        mDrawerLayout.closeDrawers();
    }


    public class YoutubeFragment extends Fragment implements YouTubePlayer.OnInitializedListener{
        private FragmentActivity myContext;

        private YouTubePlayer YPlayer;
        private static final String YoutubeDeveloperKey = "xyz";
        private static final int RECOVERY_DIALOG_REQUEST = 1;
        @Override
        public void onAttach(Activity activity) {

            if (activity instanceof FragmentActivity) {
                myContext = (FragmentActivity) activity;
            }

            super.onAttach(activity);
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            View rootView = inflater.inflate(R.layout.activity_you_tube_api, container, false);

            YouTubePlayerView youTubeView = (YouTubePlayerView) rootView.findViewById(R.id.youtube_view);
            youTubeView.initialize(YoutubeDeveloperKey, (YouTubePlayer.OnInitializedListener) myContext);
            return rootView;
        }
        @Override
        public void onInitializationFailure(YouTubePlayer.Provider provider,
                                            YouTubeInitializationResult errorReason) {
            if (errorReason.isUserRecoverableError()) {
                errorReason.getErrorDialog(this, RECOVERY_DIALOG_REQUEST).show();
            } else {
                String errorMessage = String.format(
                        "There was an error initializing the YouTubePlayer",
                        errorReason.toString());
                Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == RECOVERY_DIALOG_REQUEST)
            {

                getYouTubePlayerProvider().initialize(YoutubeDeveloperKey, this);
            }
        }



        @Override
        public void onInitializationSuccess(YouTubePlayer.Provider provider,
                                            YouTubePlayer player, boolean wasRestored) {
            if (!wasRestored) {
                YPlayer = player;
                YPlayer.setFullscreen(true);
                YPlayer.loadVideo("2zNSgSzhBfM");
                YPlayer.play();
            }
        }

    }

YouTubeFragment.java

public class YoutubeFragment extends Fragment implements
        YouTubePlayer.OnInitializedListener {
    private FragmentActivity myContext;

private YouTubePlayer YPlayer;
private static final String YoutubeDeveloperKey = "xyz";
private static final int RECOVERY_DIALOG_REQUEST = 1;

@Override
public void onAttach(Activity activity) {

    if (activity instanceof FragmentActivity) {
        myContext = (FragmentActivity) activity;
    }

    super.onAttach(activity);
}

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

    View rootView = inflater.inflate(R.layout.activity_you_tube_api, container, false);

    YouTubePlayerSupportFragment youTubePlayerFragment = YouTubePlayerSupportFragment.newInstance();

    youTubePlayerFragment.initialize("DEVELOPER_KEY", new YouTubePlayer.OnInitializedListener() {


    });
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    transaction.add(R.id.youtube_fragment, youTubePlayerFragment).commit();
    return rootView;

}
    @Override
    public void onInitializationSuccess (YouTubePlayer.Provider provider, YouTubePlayer
    youTubePlayer,boolean b){
        if (!b) {
            YPlayer = youTubePlayer;
            YPlayer.setFullscreen(true);
            YPlayer.loadVideo("2zNSgSzhBfM");
            YPlayer.play();
        }
    }

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

    }
}

布局

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment
        android:name="com.google.android.youtube.player.YouTubePlayerSupportFragment"
        android:id="@+id/youtube_fragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

错误-

Error:(64, 101) error: <anonymous com.pc.gi.ui.fragment.YoutubeFragment$1> is not abstract and does not override abstract method onInitializationFailure(Provider,YouTubeInitializationResult) in OnInitializedListener

我最近在我的应用程序中实现了一个YouTube视频播放器。 我的第一次尝试是使用YoutubePlayerFragment,但它的API有点不太实用,并且没有提供非常“流畅”的用户体验...所以我尝试在WebView中使用Youtube iframe API(https://developers.google.com/youtube/iframe_api_reference)。 Android WebView不支持所有HTML5功能,因此您需要自己处理一些东西...但这个(https://code.google.com/p/html5webview/)是一个很好的起点。 最终结果是值得的。 - Luboš Staráček
2个回答

80

首先像平常一样扩展您的Activity

 class YourActivity extends Activity...

在布局文件中添加以下行

<fragment
  android:name="com.google.android.youtube.player.YouTubePlayerSupportFragment"
  android:id="@+id/youtube_fragment"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"/>

那么在您的Activity中,您可以使用以下代码在Fragment的onCreateView方法中创建其实例。

YouTubePlayerSupportFragment youTubePlayerFragment = (YouTubePlayerSupportFragment) getActivity().getSupportFragmentManager()
                    .findFragmentById(R.id.youtube_fragment);

或者您可以在xml中声明一个FrameLayout,然后使用以下代码初始化YouTubeSupportFragment

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/youtube_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:visibility="visible" />

</RelativeLayout>

在您的onCreateView中编写代码

 YouTubePlayerSupportFragment youTubePlayerFragment = YouTubePlayerSupportFragment.newInstance();

    youTubePlayerFragment.initialize("DEVELOPER_KEY", new OnInitializedListener() {

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

            if (!wasRestored) {
                YPlayer = player;
                YPlayer.setFullscreen(true);
                YPlayer.loadVideo("2zNSgSzhBfM");
                YPlayer.play();
            }

        }

        @Override
        public void onInitializationFailure(Provider arg0, YouTubeInitializationResult arg1) {
            // TODO Auto-generated method stub

        }
    });
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    transaction.add(R.id.youtube_fragment, youTubePlayerFragment).commit();

关键在于使用YouTubePlayerSupportFragment而不是YouTubePlayerFragment

希望这可以帮助到您。

以下是您的Fragment:

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

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.YouTubePlayerSupportFragment;
import com.ismart.omanapp.R;

public class YoutubeFragment extends Fragment {
    private FragmentActivity myContext;

    private YouTubePlayer YPlayer;
    private static final String YoutubeDeveloperKey = "xyz";
    private static final int RECOVERY_DIALOG_REQUEST = 1;

    @Override
    public void onAttach(Activity activity) {

        if (activity instanceof FragmentActivity) {
            myContext = (FragmentActivity) activity;
        }

        super.onAttach(activity);
    }

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

        View rootView = inflater.inflate(R.layout.activity_you_tube_api, container, false);

        YouTubePlayerSupportFragment youTubePlayerFragment = YouTubePlayerSupportFragment.newInstance();
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.add(R.id.youtube_fragment, youTubePlayerFragment).commit();

        youTubePlayerFragment.initialize("DEVELOPER_KEY", new OnInitializedListener() {

            @Override
            public void onInitializationSuccess(Provider arg0, YouTubePlayer youTubePlayer, boolean b) {
                if (!b) {
                    YPlayer = youTubePlayer;
                    YPlayer.setFullscreen(true);
                    YPlayer.loadVideo("2zNSgSzhBfM");
                    YPlayer.play();
                }
            }

            @Override
            public void onInitializationFailure(Provider arg0, YouTubeInitializationResult arg1) {
                // TODO Auto-generated method stub

            }
        });

    }
}

1
嗨..我想在片段内播放YouTube视频..我的活动包括导航抽屉,当我点击第五项时,它会打开一个片段,在其中播放YouTube视频。如果我将此代码放在活动中,它会在导航抽屉的第五项上单击时播放YouTube视频吗?还是它只会在活动内开始播放YouTube视频?我应该在扩展片段的类中放置什么代码..请再次阅读我的问题..谢谢您的时间.. - Android Developer
3
实际上,您想要在您的碎片中使用YoutubeFragment。您需要使用getChildFragmentManager()而不是 getSupportedFragmentManager() - Sunny
1
你应该使用我的第二种方法。即创建一个 XML 文件并在其中放置一个 frameLayout,在你的 fragment 的 onCreateView 中使用我上面写的代码。 - Sunny
1
感谢您的帮助,给您的答案点个赞。请查看上面更新的YouTubeFragment.java和xml文件的代码。我也列出了我遇到的错误,请告诉我哪里出错了。 - Android Developer
1
我使用这个方法在DialogFragment中展示我的YouTubeFragment,目前已经正常工作。 - AdamHurwitz
显示剩余17条评论

2

使用片段(fragment)来实现YouTube播放器,按照以下3个步骤进行:

  1. In the activity XML file add these:

     <fragment
             android:name="com.google.android.youtube.player.YouTubePlayerFragment"
             android:id="@+id/youtube_fragment"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"/>
    
  2. In activity java file create a new OnInitialize listener

    YouTubePlayer.OnInitializedListener onInitializedListener = new 
    YouTubePlayer.OnInitializedListener() {
         @Override
         public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
    
             youTubePlayer.loadVideo("Your_video_id");
    
    
    
         }
    
         @Override
         public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
    
         }
     };
    
  3. After initializing the listener get the fragment reference and initialize the player.

    YouTubePlayerFragment youTubePlayerFragment = (YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.youtube_fragment);
    youTubePlayerFragment.initialize("You_Developer_Api_Key", onInitializedListener);
    

要获取开发者API密钥,请访问此链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接