最近App改版新版详情包含商品视频介绍,视频源都是youtube的链接,找了很久没找到合适的方案,在墙外搜索才找到一个合适的,再次记录下.仅供参考.

第三方控件参考Git:https://github.com/PierfrancescoSoffritti/android-youtube-player

我们实现是以列表形式加载多个视频的,所以以列表形式实现.

就不贴全部代码了,贴些关键代码;

    //详情视频适配器private DetailsVideoAdapter detailsVideoAdapter;//数据源参考:"videoUrlList": ["https:\\www.youtube.com\watch?v=S0Q4gqBUs7c","https:\\www.youtube.com\watch?v=xxxxxx"]if (detailsVideoAdapter == null) {detailsVideoAdapter = new DetailsVideoAdapter(this,                     videoUrlList,this.getLifecycle());LinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(LinearLayoutManager.VERTICAL);binding.rvVideo.setLayoutManager(layoutManager);binding.rvVideo.setAdapter(detailsVideoAdapter);} else {detailsVideoAdapter.setList(videoUrlList);}

适配器:

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Lifecycle;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.AbstractYouTubePlayerListener;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.views.YouTubePlayerView;import java.util.List;/*** create by* on 2022/6/1* explain${详情视频适配器}** @author */
public class DetailsVideoAdapter extends BaseQuickAdapter<String, BaseViewHolder> {private Context mComtext;private YouTubePlayerView youTubePlayerView;private Lifecycle lifecycle;public DetailsVideoAdapter(@Nullable Activity context, @Nullable List<String> data, Lifecycle lifecycle) {super(R.layout.video_item, data);this.mComtext = context;this.lifecycle = lifecycle;}@SuppressLint("SetTextI18n")@Overrideprotected void convert(@NonNull BaseViewHolder baseViewHolder, String productInfosBean) {youTubePlayerView = baseViewHolder.getView(R.id.youtube_player_view);lifecycle.addObserver(youTubePlayerView);youTubePlayerView.addYouTubePlayerListener(new AbstractYouTubePlayerListener() {@Overridepublic void onReady(@NonNull YouTubePlayer youTubePlayer) {String videoId = parseIDfromVideoUrl(productInfosBean);Log.e("Alex", "videoId:" + videoId);youTubePlayer.cueVideo(videoId, 0);}});}//解析视频的格式private static final String VIDEO_ID_START_EMBED = "embed/";private static final String VIDEO_ID_START_NORMAL = "?v=";private static final String VIDEO_ID_START_SHORT = "youtu.be/";/*** 在youtobe的连接中截取视频的ID*/public static String parseIDfromVideoUrl(String videoUrl) {if (TextUtils.isEmpty(videoUrl)) {Log.i("Alex", "videoUrl is null");return "";}int startIndex = videoUrl.indexOf(VIDEO_ID_START_NORMAL);int prefixLength = VIDEO_ID_START_NORMAL.length();if (startIndex <= 0) {startIndex = videoUrl.indexOf(VIDEO_ID_START_EMBED);prefixLength = VIDEO_ID_START_EMBED.length();}if (startIndex <= 0) {startIndex = videoUrl.indexOf(VIDEO_ID_START_SHORT);prefixLength = VIDEO_ID_START_SHORT.length();}Log.i("Alex", "startIndex==" + startIndex);if (startIndex != -1) {startIndex = startIndex + prefixLength;//有些url后面会带参数,不能把参数当idint endIndex = 0;//如果当前是普通类型的urlif (prefixLength == VIDEO_ID_START_NORMAL.length()) {endIndex = videoUrl.indexOf("&");} else {endIndex = videoUrl.indexOf("?");}if (endIndex == -1) {endIndex = videoUrl.length();}Log.i("Alex", "startIndex::" + startIndex + "   end==" + endIndex);if (startIndex < endIndex) {return videoUrl.substring(startIndex, endIndex);}} else {Log.i("Alex", "不能解析视频的ID");}return "";}}

界面:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!--    app:videoId="2vUqG-lxFx0"app:autoPlay="false"--><com.pierfrancescosoffritti.androidyoutubeplayer.core.player.views.YouTubePlayerViewandroid:id="@+id/youtube_player_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginStart="@dimen/dp_10"android:layout_marginEnd="@dimen/dp_10"/></LinearLayout>

Android 加载Webview链接类型的Youtube视频相关推荐

  1. android加载webview网页,android 加载网页Html文本--WebView

    [实例简介]解决了乱码问题 [实例截图] [核心代码] package com.cd.webview_html; import android.app.Activity; import android ...

  2. 【Android 逆向】Dalvik 函数抽取加壳 ( Dalvik 下的函数指令抽取与恢复 | dex 函数指令恢复时机点 | 类加载流程 : 加载、链接、初始化 )

    文章目录 前言 一.Dalvik 下的函数指令抽取与恢复 二.dex 函数指令恢复时机点 1.dex 函数指令恢复 2.Android 源码中搜索 dexFindClass 函数 3.类加载流程 : ...

  3. android 加载静态网页,React Native:如何在WebView内加载SPA或本地静态HTML页面?

    React Native:如何在WebView内加载SPA或本地静态HTML页面? React Native WebView允许你使用uri属性加载可公开访问的资源,就像程序内的一个浏览器.但是,当你 ...

  4. android如何添加gif,Android加载Gif和ImageView的通用解决方案:android-gif-drawable(1)...

     Android加载Gif和ImageView的通用解决方案:android-gif-drawable(1) Android自己的ImageView或者View不能直接加载运行Gif图片,如果要在 ...

  5. 【转载】Android加载大图片OOM异常解决

    官方资料: https://developer.android.com/topic/performance/graphics/load-bitmap 思路 先测试未知来源图片的尺寸和MIME文件类型; ...

  6. Android加载Gif动画android-gif-drawable的使用

    Android加载Gif动画android-gif-drawable的使用 目前支持Gif播放的开源库还是有的,不过经分析: GifView:如果Gif图片太大会导致OOM; SimpleDrawee ...

  7. java虚拟机规范-加载、链接与初始化

    前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调.java代码本身并不能为jvm识别,实际上在jvm中的表现形式为Class对象,一个java类从字节 ...

  8. Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】...

     Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨 ...

  9. android加载html

    今天写了一个小测试  android加载本地的一个html 首先main目录下新建一个assets 在android studio中新建目录时选中foder的assets 把html放入其中 在and ...

  10. android 加载外部矢量图SVG

    转自:http://blog.csdn.net/jiabailong/article/details/53736689 android加载矢量图的方式主要有以下两种: 一.Web方式 利用WebVIe ...

最新文章

  1. ajax分页node,分页数据(使用 paginate 方法)《 Node.js 应用:分页器 》
  2. layui时间怎么设置年月日时分秒_layui-laydate时间日历控件使用方法详解
  3. 【jQuery Demo】图片瀑布流实现
  4. (经典)Hibernate多对一关系映射(四)
  5. OpenCASCADE:OCCT应用框架OCAF之形状属性
  6. Slickflow.NET 开源工作流引擎基础介绍-.NET Core2.0 版本实现介绍
  7. 详细了解为什么支持Postman Chrome应用程序已被弃用?
  8. 伯克利:serverless是下一代计算范式
  9. Java 实例 - 测试两个字符串区域是否相等
  10. php为什么凉了_马蜂窝裁php换java,php又又又凉凉了吗
  11. Summary - 2017
  12. unity头顶状态制作_Unity中结合IK实现Lookat
  13. ASCII编码、GB2312编码、Unicode编码、UTF-8编码
  14. java有阴历年算法吗_中国农历算法java实现
  15. STM32学习笔记——通用定时器的PWM介绍及配置
  16. GPS接收机热启动、温启动、冷启动三种启动方式的区别
  17. MindMapper17中文版
  18. [APIO2009]采油区域 题解
  19. Mysql从删库到跑路(1)
  20. ACM-ICPC 2018 南京赛区网络预赛 AC Challenge (状态压缩DP)

热门文章

  1. python爬虫爬取糗百成人图片多线程版本
  2. 微博话题墙 html,Js仿微博插入话题功能
  3. 做了3年单片机工程师,如果工资还是3-5千,那你就看过来
  4. 用DEV-C++制作狼人杀
  5. Matlab的一些常用功能
  6. yarn : 无法加载文件 C:\Users\L\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本
  7. Ubuntu设置开机启动项目
  8. Nebula graph 源码 学习笔记
  9. 代码中的Status和State语义
  10. 【python教程入门学习】Python转义字符及用法