在 Android 应用程序中播放 Youtube 视频,无需使用 Android Youtube API

2024-03-06

有没有另一种方法可以在 Android 应用程序中播放 Youtube 视频而不使用 Android Youtube API?我们已经使用上述 API 实现了一个解决方案,但在某些设备上需要降级 Youtube 应用程序版本才能播放视频。我已经在 Github 中搜索了我可以使用的可能的库,但大多数都依赖于 Android Youtube API。也尝试过使用WebView嵌入,但有时会崩溃。

我正在通过解析结果来实现另一个解决方案并获取“的值dashmpd”,然后加载“的值dashmpd” 结果可以用作 Android 的 VideoView 中的源,但它没有音频。我注意到视频和音频有不同的源。

提前致谢!


如果你真的想使用 YouTubeiframe inside Webview代替YoutubePlayerFragment,您将需要一些工作来“重新编码”WebView 中移动设备的 Youtube 播放器控制层(屏幕尺寸/键码等...)。

我做了一个工作示例,可以帮助您开始:

AndroidManifest.xml :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yourpackage.name">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true">

        <activity
            android:name="com.yourpackage.name.YoutubeActivity"
            android:label="@string/app_name">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>

    </application>

</manifest>

另外,你说你在Weview上使用Youtube iframe时发生了一些崩溃,可能是你没有设置android:hardwareAccelerated="true"像上面一样

youtube.html in src/main/assets文件夹 :

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
  <title></title>

  <style type="text/css">

    iframe {
      position: absolute;
      border: none;
      box-sizing: border-box;
      width: 100%;
      height: 100%;
    }
  </style>

  <script>

    var player;

    // init player
    function onYouTubeIframeAPIReady() {
      player = new YT.Player('player', {
        height: '1080',
        width: '1920',
        //videoId: 'Orw8CZpzIDU',
        suggestedQuality: 'hd720',
        playerVars: {rel: 0,showinfo:0},
        events: {
          'onReady': onPlayerReady,
          'onStateChange': onPlayerStateChange
        }
      });

    }

    function loadVideo(target){
      target.loadVideoById('Orw8CZpzIDU', 0, 'hd720');
    }

    function onPlayerStateChange(event) {

        var playbackQuality = event.target.getPlaybackQuality();
        var suggestedQuality = 'hd720';

        console.log("Quality changed to: " + playbackQuality );

        if( playbackQuality !== 'hd720') {
            console.log("Setting quality to " + suggestedQuality );
            event.target.setPlaybackQuality( suggestedQuality );
        }

        console.log(event.data + " et " + YT.PlayerState.PLAYING);
    }

    // when ready, wait for clicks
    function onPlayerReady(event) {
      event.target.setPlaybackQuality('hd720');
      var player = event.target;
      loadVideo(player);
      return false;
    }

  </script>
</head>

<body id="body">

  <div id="video_div">

    <script src="https://www.youtube.com/iframe_api"></script>

    <div id="bottom">
      <div id="player"></div>
    </div>

  </div>

</body>

</html>

And YoutubeActivity.java :

public class YoutubeActivity extends Activity {

    private WebView webview;

    @Override
    protected void onPause() {
        super.onPause();
        webview.onPause();
    }

    @Override
    protected void onResume() {
        webview.onResume();
        super.onResume();
    }

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        webview = new WebView(this);
        setContentView(webview);

        final WebSettings settings = webview.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
        settings.setPluginState(WebSettings.PluginState.ON);
        settings.setLoadWithOverviewMode(true);
        settings.setUseWideViewPort(true);

        webview.setWebChromeClient(new WebChromeClient());
        webview.setPadding(0, 0, 0, 0);

        webview.loadUrl("file:///android_asset/youtube.html");
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 应用程序中播放 Youtube 视频,无需使用 Android Youtube API 的相关文章

  • 如何从Firebase Firestore实时更新文档中获取修改后的字段或数据? [复制]

    这个问题在这里已经有答案了 我有多个文档 我的问题是我无法获取修改的特定数据 我正在获取完整的文档 db collection employees whereEqualTo OID OID addSnapshotListener new E
  • 在 ChromeO 上安装未知来源的 apk

    我今天早上更新了我的 Chromebook Asus Flip 以获取 Play 商店 我的 Chromebook 安装了 M53dev 通道版本 它运作良好 我可以安装并运行从 Play 商店下载的 Android 应用程序 我想测试我的
  • Android 中的 Fragment-Fragment 通信

    我在Android编程方面处于初级水平 所以我需要你真诚的帮助 请任何人帮助我 我正在尝试使用片段构建滑动用户界面 所以我真正的疑问是 我有一个Fragment say FragmentA 它有一个TextView and Button在其
  • 拖动时跳转 ImageView。 getX() 和 getY() 值正在跳跃

    我创建了一个用于拖动视图的 onTouchListener 如果我使用的话 图像可以顺利拖动getRawX and getRawY 问题是 当您向下放置第二个指针然后抬起第一个指针时 图像将跳转到第二个指针 此 onTouchListene
  • 在 gradle 中,我应该排除分支下的所有依赖项还是只排除根就足够了?

    我已将以下自定义任务添加到我的build gradlefile 为了打印出依赖项的依赖项 This part is useful for finding conflict resolution s between dependencies
  • 覆盖 Android 中的电源按钮

    我正在开发一个应用程序 其中我需要在按下电源按钮时执行一个操作 但不幸的是我无法处理按下电源按钮时的操作 我尝试使用 onKeyDown 和dispatchKeyEvent 方法 但似乎没有任何效果 任何人都可以建议我解决这个问题的任何其他
  • 华为手机“受保护的应用程序”设置及处理方法

    我有一台搭载 Android 5 0 的华为 P8 用于测试应用程序 该应用程序需要在后台运行 因为它跟踪 BLE 区域 我发现华为内置了一个名为 受保护的应用程序 的 功能 可以从手机设置 电池管理器 gt 受保护的应用程序 访问该功能
  • HMS 核心地图套件在我的 Android 应用程序上根本无法工作

    我正在尝试在我的应用程序中使用华为 HMS 地图套件 我对整体地图很陌生 无论是来自谷歌还是华为 我按照文档中的教程以及华为提供的代码实验室中的说明进行操作 并将我的代码在一起 但是当我运行地图活动时 什么也没有出现 我得到的只是一个空白活
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • 选项卡主机内的 Android Fragment 视图状态 [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Fragment 为 Android 中的每个选项卡单独的返回堆栈 https stackoverflow com questions 6987334 separate back stack f
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 是否可以通过 Android 应用程序来录音?

    我是一名开发人员 希望创建一个 Android 应用程序来记录电话 这是出于我个人的需要 为了我自己的目的和记录而记录电话 是否有可能做到这一点 是否可以访问麦克风以及通过扬声器发出的声音 我对 Android 开发有点陌生 所以请耐心等待
  • YouTube 直播嵌入代码不断变化

    我使用 YouTube 进行直播 并且可以通过将嵌入代码复制到我的网站中来在我的网站上观看它 它看起来像下面这样 但最近我发现 每次进行直播时 我都必须开始使用从直播频道生成的代码来更新网站上的嵌入代码 这是因为它不断重新生成不同的代码 这
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 在运行时更改用作背景的 Drawable xml 内的形状纯色

    我有一个 Drawable xml 文件 background xml
  • 哪个视图最亮?

    在Android中 哪个是轻量级视图 例如 View Textview Edittext 等 在某些情况下 我们需要使用视图来填充区域而不向用户显示视图 同时屏幕加载速度应该很快 您可以使用空间 android widget Space S
  • 当目标小于 Android O 时,如何在 Android O 上创建快捷方式?

    背景 Android O 对快捷方式的工作方式进行了各种更改 https developer android com preview behavior changes html as https developer android com
  • 离子初始加载时间

    我正在使用 Ionic 构建一个简单的应用程序 但我的应用程序在冷启动时的初始加载时间方面存在性能问题 这是我所做的 collection repeat 代替带有 track by 的 ng repeat 原生滚动 overflow scr
  • 如何在android中通过蓝牙向配对设备发送短信?

    在我的应用程序中 我想通过蓝牙发送和接收短信 我可以在列表视图中看到配对设备名称和地址的列表 但是当我尝试向配对设备发送文本时 什么也没有发生 在其他设备中没有收到文本 这是我向配对设备发送消息的代码 private void sendDa
  • Android 标记如何实现拖放?

    你好 我正在 Android 中开发 MapView 应用程序 我有三个标记 我希望稍后能够使用 Google Map API getlocation function 为了尝试一下 我想使用拖放功能移动标记 然后检查位置 任何人都可以通过

随机推荐

  • 如何从java中的int中获取最高有效的n位

    我有一个 int 我想获得 java 中的 19 个最高有效位 我尝试了各种方法 但没有一个有效 有人可以帮帮我吗 添加布拉姆的答案 你甚至不需要AND如果您使用无符号移位 myInt gt gt gt 13 将为您提供 19MSB 尽管它
  • 将 UIViewController 视图属性设置为没有故事板/笔尖的自定义 UIView 类

    我有一个UIViewController called LoginViewController 我想建立这样的观点LoginViewController 完全以编程方式在一个习惯中UIView类称为LoginView而不是在我的内部构建所有
  • C++ 使用 unicode 名称保存文件问题 - 如何以跨平台方式正确保存 UTF-8 文件名?

    我想保存一个带有名称的文件 jpg我收到一个字符串 例如从文件中读取 其中包含 unicode 但我的 C 代码将其保存为 jpg我该怎么做才能正确保存它 顺便说一句 如果我只是将该字符串保存到文件中 它会正确保存 这意味着只有我保存文件名
  • 短到十六进制字符串

    有方法Integer toHexString and Long toHexString 由于某种原因他们没有实施Short toHexString 将 Short 转换为十六进制字符串的规范方法是什么 无法使用Integer toHexSt
  • 将嵌套数组简化为单级数组[重复]

    这个问题在这里已经有答案了 可能的重复 如何展平多维数组 https stackoverflow com questions 1319903 how to flatten a multidimensional array 假设我有一个这样的
  • SonarQube:一天有多少小时的技术债务?

    如果 SonarQube 说我在某个项目中有 1 天的技术债务 那么这是否会转化为 24 小时的技术债务或 8 小时的技术债务 从几小时到几天的转换是可定制的 默认情况下为 8 小时 但您可以通过转至管理 gt 配置 gt 技术债务来找到您
  • 查找不是父/祖父母/等或子/孙/等的所有链接对象的算法

    我有一个名为Device A Device可以有一位家长 Device A Device还可以有n child Devices 我有一个下拉列表 显示所有可选的Devices 我可以获得所有Devices很容易在数据库中 db Device
  • 在 Scala 中使用 @BeanProperty 而不是定义 getter/setter 函数是一个好习惯吗?

    在类中定义可以公开访问 修改的数据成员 var foo Int def foo foo Int foo foo setter function def foo foo getter function 使用注释转换它是一个好习惯吗 BeanP
  • 如何更改Resharper的字体大小?

    如何更改Resharper的字体大小 我发现文件结构 实时模板和其他 UI 组件的字体小得难以忍受 我找不到任何自定义字体大小的选项 我尝试将 Windows DPI 增加到 150 这确实有效 但会导致很多其他问题 我正在使用 Resha
  • 为定制 RISC-V imafd SOC 移植 Linux

    我正在尝试构建一个 yocto演示 coreip cli我的自定义 risc v SOC 的图像仅支持imafd指示 对于 Bitbake 使用的交叉工具链的编译 我尝试更改 openembedded core 层中的 cross binu
  • Three.js 使用 WebRTC 并应用 Shader

    我不知道如何将着色器应用于具有视频纹理的 Three js 对象 我一直在使用 webRTC 和 Three js 并使用标准材质成功将视频纹理映射到网格上 var material new THREE MeshBasicMaterial
  • 使用 SimpleAdapter 过滤 listView 数据

    我需要帮助才能使过滤发挥作用 ListView 显示正确 但是当我在搜索字段中输入字母时出现错误 java lang NullPointerException 并且应用程序关闭 这是我的活动中的代码片段 我认为我必须修复它 但不知道如何修复
  • Android 计费 v3 - 无签名

    我想要的是 检索所有购买的商品后 我需要在服务器上验证购买情况 我想使用从应用内付款收到的签名和签名数据来完成此操作 首先 我使用了应用内计费 v2 每次使用我的开发者帐户都会获得静态测试 sku 的正确签名和签名数据android tes
  • 如何在 Katalon Studio 中读取 Excel 工作表中的数据

    我可以知道如何从 Katalon Studio 中的 Excel 工作表中读取数据 以便从文件中读取 API 端点以检查其输出吗 如何在 java 中编写代码以使 URL 运行并验证来自 API 端点的响应 我已经创建了一个示例项目 htt
  • 是否可以使用 SSE 对此嵌套进行矢量化?

    我从来没有为 SSE 优化编写过汇编代码 如果这是一个菜鸟问题 我很抱歉 在this https felix abecassis me 2012 08 sse vectorizing conditional code 文章解释了如何向量化f
  • VBScript 函数中的变量范围

    我有一个关于 VBScript 中变量范围的问题 我知道有以下关键字 来自autoitscript com http www autoitscript com autoit3 docs keywords Dim htm Dim 本地范围 如
  • XRX 是唯一完全符合 W3C 的全栈 Web 应用程序“框架”吗?

    XRX 是指前端完全用 XML 方言编写 后端完全用 XML 方言编写的应用程序 并且数据在它们之间以 XML over REST 的形式传递 这是唯一完全由 W3C 维护的技术组成的 Web 应用程序堆栈 对吗 我认为回答这个问题的最佳方
  • UIScrollView 在 Swift 中不滚动

    我的 UIScrollView 不会向下滚动 我不知道为什么 我已经关注了有关此问题的 Apple 文档 IBOutlet weak var scroller UIScrollView override func viewDidLoad s
  • 限制样式表对父窗口小部件的影响?

    我正在设置 a 的背景颜色QWidget子类 当我使用样式表执行此操作时 其他组件的样式QWidget更改 例如 按钮的颜色及其外观发生变化 如何确保只有容器小部件的背景颜色发生变化 其余子组件保持不变 一种方法是指定 ID 选择器 确保设
  • 在 Android 应用程序中播放 Youtube 视频,无需使用 Android Youtube API

    有没有另一种方法可以在 Android 应用程序中播放 Youtube 视频而不使用 Android Youtube API 我们已经使用上述 API 实现了一个解决方案 但在某些设备上需要降级 Youtube 应用程序版本才能播放视频 我