IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android TV开发--HDMI播放器 -> 正文阅读

[移动开发]Android TV开发--HDMI播放器

 最近接到一个需求:做一个HDMI播放器的Demo,具体就是做一个Demo,安装在Android TV上,安卓TV接入安卓盒子,信号源是HDMI,打开播放器的Demo可以播放盒子里面的资源。
 网上这方面的资源不是很多,因为最近在看安卓系统应用开发相关内容,了解到在Android Tv上就有一款应用是来显示Hdmi信源内容的,这个应用就是LiveTv。所以,把注意力都集中在LiveTv的源码上,通过阅读LiveTv的源码可以知道LiveTv的实现核心是通过安卓控件TvView来显示输入源tvInput内容的。
 播放器的内容比较简单,主要分两步:
 首先获取当前设备的输入源,比较简单,看下面的代码即可:
    /**
     * 获取当前设备的输入源列表
     */
    private void initData() {
        TvInputManager tvInputManager = (TvInputManager) getSystemService(Context.TV_INPUT_SERVICE);
        if (tvInputManager == null) {
            return;
        }
        list = tvInputManager.getTvInputList();
        for (TvInputInfo info : list) {
            Log.i(TAG, "id 信号源 :" + info.getId());
        }
    }

打印如下:

SignalActivity: id 信号源 :com.mediatek.tvinput/.hdmi.HDMIInputService/HW6
SignalActivity: id 信号源 :com.mediatek.tvinput/.hdmi.HDMIInputService/HW5
SignalActivity: id 信号源 :com.mediatek.tvinput/.tuner.TunerInputService/HW0`

有三个输入源,打印的是TvInputInfo 的id,这个id是TvView显示tvInput内容的关键,下面简单介绍一下TvView控件。

TvView类概述:
显示TV内容。TvView类为应用程序提供了一个高级接口,以显示实现TvInputService的各种TV信号源的节目。(注意系统上可用的TV Inputs列表可以通过调用TvInputManager.getTvInputList()来获取。
一旦应用程序提供了特定TV通道的URL给tune(inputId, Uri)方法,它负责下层的服务绑定(和解除绑定如果当前的TvView已经绑定到一个服务)并且根据需要自动的分配或者释放资源。
看了上面谷歌官方的介绍大概了解了TvView是什么和怎么使用的了,下面看第二步:显示input内容。
上面获取了Tvinput列表,可以获取特定频道的Id,也即是tune()的第一个参数,那第二个参数Uri怎么获取呢? 下面看一下LiveTv的源码:

    /**
     * Build a special channel URI intended to be used with pass-through inputs. (e.g. HDMI)
     *
     * @param inputId The ID of the pass-through input to build a channels URI for.
     * @see TvInputInfo#isPassthroughInput()
     */
    public static Uri buildChannelUriForPassthroughInput(String inputId) {
        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(AUTHORITY)
                .appendPath(PATH_PASSTHROUGH).appendPath(inputId).build();
    }

通过上面的代码可以知道,Uri可以由TvContract类的buildChannelUriForPassthroughInput()方法转化InputId得到.
获取到了两个必要的参数,下面直接调用TvView的方法tune()即可显示tvInput的内容,看代码:

  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void playHdmi(String inputId) {
        mTvView.reset();
        // Build a special channel URI intended to be used with pass-through inputs. (e.g. HDMI)
        Uri uri = buildChannelUriForPassthroughInput(inputId);
        mTvView.tune(inputId, uri);
    }

运行Demo到安卓Tv,点击播放按钮,tvinput的内容显示出来了。
有个问题要说一下,我们在第一部获取到的TvInput列表是三个,可能不是三个信源都可以显示出内容,我是三个信源都试了一遍才发现只有一个有内容的,在播放前还不确定哪个inputID的可用的,不过在播放时,TvView有个回调方法,可以返回可用的input:

SignalActivity: onVideoAvailable: com.mediatek.tvinput/.hdmi.HDMIInputService/HW5

播放器的功能基本实现了,代码不多,主要代码都列出来了,如果有其他更好方案,欢迎交流!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-19 12:00:17  更:2021-10-19 12:00:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:01:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码