环境要求

1.安装youtube apk。 2.网络翻墙。

在没有谷歌登录需求的时候可以不集成谷歌服务框架。当然,这样也会导致youtube应用无法正常使用,会一直弹窗提示没有谷歌服务。由于是定制Rom,我只需把youtube桌面图标隐藏就可以了,有需要的话再预装一个不依赖谷歌服框架的youtube相关应用即可(比如smarttube),内容和正版youtube一样的。

步骤:

1.在youtube开发者平台注册应用,获取API key 值

2.下载youtube sdk jar包

youtube 视频列表接口https://developers.google.cn/youtube/v3/docs/videos/list#http-request

可参考https://blog.csdn.net/u011503666/article/details/107942793https://blog.csdn.net/u011503666/article/details/107942793

YoutubePlayer android sdkhttps://developers.google.com/youtube/android/player3.简单应用场景(手机、电视等)根据视频id(如:fY7jIJE0c7Y),调用youtubePlayer.cueVideo(id)即可。这里不详细介绍了,网上很多样例。

我这里主要介绍一下再副屛(Presentation)中播放的场景。由于YouTubePlayerView必须依赖于一个继承自YouTubeBaseActivity的Activity来进行实例化,否则会报错,源码如下:

而副屛类Presentation本质上是一个Dialog,无法直接实例化 YouTubePlayerView,不能像在MainActivity实现一样直接可以在xml文件中声明就可以了。所以只能曲线救国,大体的思路就是MainActivity继承YouTubeBaseActivity,然后将MainActivity实例作为参数传入Presentation,在Presentation中通过new YouTubePlayerView(activity)来实例化播放组件,然后通过addView动态添加到副屛视图上。主要代码如下:

package com.example.youtube;import android.app.Activity;
import android.app.Presentation;
import android.content.Context;
import android.hardware.display.DisplayManager;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;
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.YouTubePlayerView;
import com.google.android.youtube.player.YouTubePlayer.Provider;public class YoutubePlayFragment {private YouTubePlayerView mPlayerView;private YouTubePlayer mYouTubePlayer;private FrameLayout mPlayerViewParent;private MyPlayerStateChangeListener playerStateChangeListener; // 播放状态监听private MyPlaybackEventListener playbackEventListener; // 播放事件回调private YoutubePresentation youtubePresentation;private Activity mAtv;private View mRootView;private Handler mHandler;private static YoutubePlayFragment instance;private OnYoutubePlayerInitFinishListener mlInitFinishListener;public static YoutubePlayFragment getInstance(Activity paramActivity){if(instance==null){synchronized (YoutubePlayFragment.class) {if(instance==null){instance = new YoutubePlayFragment(paramActivity);}else{return instance;}}}return instance;}private void initView(View view){mHandler = new Handler();mRootView = view;this.mPlayerViewParent = (FrameLayout)view.findViewById(R.id.root);if (this.mPlayerView == null) {this.mPlayerView = new YouTubePlayerView(getActivity());}if(this.mPlayerView.getParent() != null)((ViewGroup)this.mPlayerView.getParent()).removeView(this.mPlayerView);this.mPlayerViewParent.addView(this.mPlayerView, new ViewGroup.LayoutParams(-1,-1));playerStateChangeListener = new MyPlayerStateChangeListener();playbackEventListener = new MyPlaybackEventListener();mPlayerView.initialize("你的APP KEY", new OnInitializedListener() {@Overridepublic void onInitializationSuccess(Provider arg0, YouTubePlayer player,boolean arg2) {// TODO Auto-generated method stubmYouTubePlayer = player;mYouTubePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.MINIMAL);mYouTubePlayer.setPlayerStateChangeListener(playerStateChangeListener);mYouTubePlayer.setPlaybackEventListener(playbackEventListener);mYouTubePlayer.setManageAudioFocus(true);mlInitFinishListener.onPlayerInited();                  }@Overridepublic void onInitializationFailure(Provider arg0,YouTubeInitializationResult arg1) {// TODO Auto-generated method stub}});}public void playVideo(String videoId){if(mYouTubePlayer!=null){mYouTubePlayer.cueVideo(videoId); mYouTubePlayer.play();}}public void show(){Display[] displays = ((DisplayManager)this.mAtv.getSystemService("display")).getDisplays();if (this.youtubePresentation == null){this.youtubePresentation = new YoutubePresentation(this.mAtv, (Context)this.mAtv,displays[displays.length - 1]);}if (!this.youtubePresentation.isShowing()){this.youtubePresentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);        this.youtubePresentation.show();}}private YoutubePlayFragment(Activity paramActivity){this.mAtv = paramActivity;}private Activity getActivity(){return this.mAtv;}private final class MyPlaybackEventListener implements YouTubePlayer.PlaybackEventListener {@Overridepublic void onPlaying() {// Called when playback starts, either due to user action or call to// play().Log.i("jlink", "YouTube Playing");}@Overridepublic void onPaused() {// Called when playback is paused, either due to user action or call// to pause().Log.i("jlink", "YouTube Paused");}@Overridepublic void onStopped() {// Called when playback stops for a reason other than being paused.Log.i("jlink", "YouTube Stopped");}@Overridepublic void onBuffering(boolean b) {// Called when buffering starts or ends.Log.i("jlink", "===youTubePlayer onBuffering");}@Overridepublic void onSeekTo(int i) {Log.i("jlink", "===youTubePlayer onSeekTo");// Called when a jump in playback position occurs, either// due to user scrubbing or call to seekRelativeMillis() or// seekToMillis()}
}private final class MyPlayerStateChangeListener implements YouTubePlayer.PlayerStateChangeListener {@Overridepublic void onLoading() {Log.i("jlink", "===youTubePlayer onLoading");// Called when the player is loading a video// At this point, it's not ready to accept commands affecting// playback such as play() or pause()}@Overridepublic void onLoaded(String s) {Log.i("jlink", "===youTubePlayer onLoaded");// Called when a video is done loading.// Playback methods such as play(), pause() or seekToMillis(int) may// be called after this callback.mYouTubePlayer.play();}@Overridepublic void onAdStarted() {// Called when playback of an advertisement starts.Log.i("jlink", "===youTubePlayer onAdStarted");}@Overridepublic void onVideoStarted() {// Called when playback of the video starts.Log.i("jlink", "===youTubePlayer onVideoStarted");}@Overridepublic void onVideoEnded() {// Called when the video reaches its end.Log.i("jlink", "===youTubePlayer onVideoEnded");mYouTubePlayer.seekToMillis(0);}@Overridepublic void onError(YouTubePlayer.ErrorReason errorReason) {// Called when an error occurs.Log.i("jlink", "===youTubePlayer errorReason==" + errorReason);}
}private class YoutubePresentation extends Presentation{private View mContentView;public YoutubePresentation(Activity paramActivity, Context paramContext, Display paramDisplay){super(paramActivity,paramDisplay);}protected void onCreate(Bundle paramBundle){super.onCreate(paramBundle);this.mContentView = View.inflate(getContext(),R.layout.youtube, null);setContentView(this.mContentView);YoutubePlayFragment.this.initView(this.mContentView);}}public interface OnYoutubePlayerInitFinishListener{void onPlayerInited();}public void setOnPlayerInitedListener(OnYoutubePlayerInitFinishListener listener){mlInitFinishListener = listener;}
}

使用时直接调用即可:

YoutubePlayFragment.getInstance(MainActivity.this).playVideo(videoId);

android 定制ROM集成 YouTube API,并实现双屏异显(主屏展示列表,副屛播放视频)相关推荐

  1. Android之 双屏异显控制

    一 简介 1.1 我们用的手机基本上只有一个屏幕,那这里的双屏指的什么呢?其实现在手机都是支持双屏的,我们可以在开发者选项里面来打开这个控制,来看下什么是双屏. 可以打开设置 -> 开发者选项 ...

  2. 【转载】Android 双屏异显方案

    一.技术的背景 随着电梯广告传媒行业的飞速发展,双屏广告机应运而生,客户可以根据自己的需求,制作两个屏幕的内容,分别播放适合屏幕显示方式播放的内容,如上面播放视频,下面播放图片,使得宣传的效果多样化. ...

  3. Android双屏异显的实现

    概述 Android实现双屏异显的实现方式有2种. 方式一:在Android4.2及以上平台上,按照标准Android SDK提供的API,使用Presentation类,将一个APP的相关内容显示到 ...

  4. Android双屏异显另辟蹊径---minui的移植

    minui介绍 minui是Android自带的一个画图工具,可以绘制一些简单的图形和图像,显示png图片,显示字符串等. 在Android设备中譬如,关机充电动画,自动测试程序,recovery模式 ...

  5. Android 双屏异显

    背景: 日常生活中,有时候会遇到 Android 设备连接两个屏幕进行显示的问题,比如酒店登记信息时,一个屏幕用于员工操作,一个屏幕显示相关信息供顾客查看.这里就涉及到 Android 的双屏异显的问 ...

  6. Android 双屏异显(兼容android8)

    1.双屏判断(是否支持双屏异显) 2.权限申请(android 6 以后需要申请权限) 3.客显实例化 (客显布局) public void initDiffDisplay() {try {Displ ...

  7. android pos机对接微信刷脸支付时如何做到双屏异显-2020年10月9日

    --------------------越让你感到困难的东西其实内在越简单. 对接微信支付刷脸支付时出现的问题,因为我这边使用的是大屏的双屏异显的pos机,在做第二个屏幕显示的时候我使用的是prese ...

  8. 安卓系统双屏异显_双屏异显在Android系统上的实现

    康金荣+彭宏利 摘 要:提出了一种在ARM/Android平台上实现双屏异显功能的方法.所谓双屏异显,即在同一软硬件平台上,实现同时驱动两块LCD屏幕,并且这两块屏幕所显示的内容可以不同.这种功能的实 ...

  9. Android双屏异显

    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一.设置Simulate secondary displays 二.实现副屏异显 三.实现效果 Andr ...

  10. 【RK3288 Android 7.1 / KEN】双屏异显流程

    RK3288_Android 7.1 双屏异显流程 异显功能使能 控制代码位置: 触发异显 控制代码位置: 方法 1 主要流程: 方法 2 关键步骤: 异显流程 控制代码位置: setOnlyShow ...

最新文章

  1. 占失物,笔记本电脑电池
  2. 定了!5G商用牌照近期发放​​​​,透露两大信息(附:2019年5G行业关键材料及市场研究报告)...
  3. python怎么重新开始_人人都是数据科学家从新开始用Python学习数据科学的完整教程P3...
  4. Codeforces Round #513
  5. undefined reference to 'pthread_create'问题解决
  6. SpringBoot无法书写主启动类的情况之一
  7. javalibrary 线上_线上的少儿口才培训班-1V1精品课程【演讲与口才吧】
  8. Git学习系列之Git的功能特性(从一般开发者的角度和主开发者的角度来剖析)...
  9. 重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准
  10. thinkphp如何跨模块调用方法呢?
  11. mybatis框架中的queryWrapper的or查询,联想到MySQL中and 和or的关系
  12. 关于ARM的22个常用概念
  13. IBM计划未来四年在美聘用2000名退伍军人
  14. 2020年9月26日-02-软件工程-工程化思维+瀑布模型+敏捷开发
  15. 简单说下C#变量的作用域
  16. B端产品如何应对个性化需求
  17. 安装好panel部署MySQL_实战三种方式部署 MySQL5.7
  18. 进程和线程的区别【转】
  19. c语言字符串strl复制转换,C语言字符串基础学习
  20. html 表单在当前窗口打开,js使用post 方式打开新窗口

热门文章

  1. python买卖股票_Python实现买卖股票的最佳时机的一种方法
  2. gpio_desc()的分析
  3. 顺丰快递单号查询API开发指南-快递鸟
  4. 解决IDEA SSM项目sql文件打开提示No data sources are configured to run this SQL and provide advanced code ass的问题
  5. 你还在用截图工具,获取视频中的图片?
  6. 如何获得onblur中的值_js中onfocus、onblur事件
  7. Eureka的自我保护机制
  8. 关闭Software Reporter Tool
  9. DELL存储SCv3020组件概念
  10. 各运营商虚拟主机对比_满足您需求的最佳虚拟主机提供商