【问题标题】:Workaround for Youtube API?Youtube API 的解决方法?
【发布时间】:2017-12-06 12:30:44
【问题描述】:

我知道以前可能有人问过这个问题,但这是我参与的一个特殊情况..

重要 我需要在一个单独的类中执行此操作,而不是一个活动。实际上我的类扩展了别人写的 BaseViewPagerAdapter..

这个想法是,我不能使用 YoutubePlayerView,因为我不能扩展 YoutubeBaseActivity。

我也尝试使用 YoutubePlayerSupportFragment,同样无法正常工作,因为我无法从我的 XML 文件中获取 的引用...

我确实尝试过这样的事情

public class YTVideoFragment extends YouTubePlayerSupportFragment {
private final static String TAG = "YoutubeVideoFragment";
private static final String DEV_KEY = "key";
private static String id;
private YouTubePlayer mPlayer;
public static YTVideoFragment newInstance(String url){
    YTVideoFragment videoFragment = new YTVideoFragment();
    Bundle bundle = new Bundle();
    bundle.putString("uri", url);
    videoFragment.setArguments(bundle);
    videoFragment.init(0);

    Log.i(TAG, "new Instance FINAL ");
    return videoFragment;

}

public void init(final int time) {
    initialize(DEV_KEY, new YouTubePlayer.OnInitializedListener() {
        @Override
        public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
            mPlayer = youTubePlayer;
            Log.i(TAG, "-=onInitializationSuccess=-");
            mPlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT);
            id = getArguments().getString("url");
            if (!b){
                mPlayer.loadVideo(id, time);
            }
        }

        @Override
        public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
            Log.i(TAG, "-=onInitializationFailure=-");
            Log.e(TAG, youTubeInitializationResult.toString());
        }
    });
}

}

我在扩展 BaseViewPageAdapter 的类中创建了一个实例并尝试这样做

YouTubePlayerSupportFragment youtube = YouTubePlayerSupportFragment.newInstance();
                youtube.getFragmentManager().beginTransaction().replace(R.id.youtubeplayerfragment,youtube);

但是我得到一个错误,replace function is applied on an null object reference ..

如果您有任何建议或想法,我将不胜感激

【问题讨论】:

  • 我觉得你需要把youtube.getFragmentManager().beginTransaction().replace(R.id.youtubeplayerfragment,youtube);改成activity.getFragmentManager().beginTransaction().replace(R.id.youtubeplayerfragment,youtube);
  • @sunil 我无法获得活动...因为我不在活动课程中
  • 那你需要把activity或者context实例传给这个类。
  • 你能解释更多吗?或者,至少给我一个例子
  • 你在哪个班级做这个?你是如何开始这堂课的?在 intilization 期间,只需传递 'context' 或 'activity' 就像这样ClassWhereTransaction f = new ClassWhereTransaction(activity);

标签: java android youtube-api


【解决方案1】:

好的,我设法让它像这样在我的上下文中工作

首先,我将 YTVideoFragment 类更改为 extends Fragment

public class YoutubeFragment extends Fragment {

private static final String API_KEY = DateUtils.getDeveloperKey();


private static String VIDEO_ID;


public void setVideoID(String id){
    VIDEO_ID = id;
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.youtube_layout, container, false);


    YouTubePlayerSupportFragment youTubePlayerFragment = YouTubePlayerSupportFragment.newInstance();


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


    youTubePlayerFragment.initialize(API_KEY, new OnInitializedListener() {


        @Override
        public void onInitializationSuccess(Provider provider, YouTubePlayer player, boolean wasRestored) {
            if (!wasRestored) {
                player.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT);
                player.loadVideo(VIDEO_ID);
                player.play();
            }
        }

        @Override
        public void onInitializationFailure(Provider provider, YouTubeInitializationResult error) {
            // YouTube error
            String errorMessage = error.toString();
            Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_LONG).show();
            Log.d("errorMessage:", errorMessage);
        }
    });

    return rootView;
}
}

并在我需要它的地方创建了该类的实例

YoutubeFragment youtubeFragment = new YoutubeFragment();
                youtubeFragment.setVideoID(eventData.getYoutube_id());
                FragmentManager fragmentManager = ((FragmentActivity) context).getSupportFragmentManager();
                fragmentManager.beginTransaction().replace(R.id.relativeLayout, youtubeFragment)
                        .commit();

我必须在这里提到,在 BaseViewPagerAdapter 中,我必须将上下文转换为 (FragmentActivity) 才能调用 getSupportFragmentManager();

将替换我的主 XML 文件中的 VideoView 的框架布局 XML 是这样的:

<?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_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerHorizontal="true"
    android:visibility="visible" />
</RelativeLayout> 

【讨论】:

    猜你喜欢
    • 2018-11-21
    • 2014-01-14
    • 2018-03-27
    • 1970-01-01
    • 2012-02-24
    • 2016-05-16
    • 2019-05-29
    • 2011-12-09
    • 2016-09-03
    相关资源
    最近更新 更多