Android TV 开发之 TV视频播放器(上)

简介: Android TV 开发之 TV视频播放器(上)

Android TV视频播放器VideoView


不想往下看可以直接在GitHub上面克隆到自己的项目中


闲谈

 最近公司又给了一个新任务,说要做电视机顶盒开发,这个机顶盒开发之前也没有接触过啊,没经验,这使我走了很多坑,写这个日志就是帮助和自己一样的新手开发代码顺利一些,少走弯路,如果你是有经验的,请无视我的废话和文章,因为我将从创建项目开始写这篇日志,这意味着会比较无聊,你要有心理准备,当然如果你是一个新手的话,恰好最近又要做AndroidTV的开发,那么你就来对地方了,好了,话不多说了,进入正题吧。

简介

 Android TV 开发,顾名思义也就是电视开发,说的高端点就是智能电视,相信你们家里都有吧,不要说你家至今用着十几年前的老电视,那我无话可说了,TV开发的资源我从网上找到的都是一些零零碎碎的,不够完整,而有一些项目还要你给积分才能去下载看,不够开源,痛定思痛,我决定自己弄一个开源的项目出来,自己来维护,学习中开发,也有可能TV这方面的文章我还会写,也有可能只写这一篇,接下来我们从创建TV项目开始。


正题

开发准备:

 电脑(笔记本、台式都行)、JDK环境变量配置(PS:因为是Java写的,想了解Kotlin的可以和我沟通)、Android Studio3.5(开发软件)。


创建项目:

第一步:File → New → New Project


20200309145658478.png


第二步:选择TV 然后创建一个空的项目也就是点左边的 Add No Activity(PS:为什么不用谷歌的框架呢,因为这个第一次我觉得自己从头来一遍会比较好,这样更有帮助,后面你再用这个框架,而且这个空项目进去之后在,AndroidManifest.xml里面还是要添加leanback的,下面继续吧)


20200309150331186.png


第三步:确定你的开发信息无误之后点击Finish,创建这个项目(Android Studio3.5中开发TV 最低的API版本为5.0,低于这个版本则不能正常运行)


20200309151537160.png


第四步:然后我们打开这个项目


20200309151842668.png


第五步:可以看到AndroidManifest.xml文件中没有运行Main的一个主活动,所以上面的是机器人头会有一个红色的小×,然后创建一个MainActivity之后再改动这个文件。


20200309152051389.png


第六步:鼠标右键你的包名 → New → Activity → Empty Activity(空的活动)


20200309152429626.png


20200309152711871.png



上图中我勾选了Launcher Activity(勾中的意思就是把你的这个Activity作为运行的主入口,默认是不勾中的,因为我的AndroidManifest.xml文件中没有主运行活动,所以我勾中),然后点击Finish


20200309153109937.png


创建好之后打开AndroidManifest.xml文件可以看到,中间多个一部分配置内容,主要的意思就是将MainActivity这个活作为启动入口,然后可以看到上方的mainfest下面有一条红色波浪线,这说明有问题,然后具体看看是什么问题。


鼠标放在上面可以看到有一个tip,


20200309153418358.png


意思很明显要我们配置leanback眼熟不? 然后我们鼠标点击这个mainfest使用快捷键Alt + Enter 引入配置,引入三次之后发现不报错了


20200309153717114.png


这个时候这个项目已经初步搭建完成了,(PS:我是不是很啰嗦啊)


配置项目:


你以为这个时候你就能运行了吗?不,你不能,首先你得找一台虚拟机或者一台真机,我这里用的是真机,然后用usb线连接上你的电脑,然后打开这个机顶盒的开发者模式,再启用usb调试,这个时候你的Android Studio中就会有读取到你的设备名称(PS:这一块有时候比较看人品,不见得你就能成功,所以我成功了!)


20200309155917829.png


这是我的设备名称,接下来就是配置项目的build.gradle,在android的闭包里面加入:

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }


然后在dependencies闭包中加入:(这几句代码有什么用呢,因为我不想再写findById了,所以用BindView的方式来做)


//butterknife
    implementation 'com.jakewharton:butterknife:10.1.0'
    annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'


build.gradle的完整代码如下:

apply plugin: 'com.android.application'
android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"
    defaultConfig {
        applicationId "com.llw.androidtvdemo"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.leanback:leanback:1.0.0'
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    //butterknife
    implementation 'com.jakewharton:butterknife:10.1.0'
    annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
}


build.gradle改动代码之后记得sync一下啊,否则改动无效的。


加入上述代码后,点击File → Settings → Plugins → Marketolace → 输入butterknife然后搜索 → 再下载安装 安装之后会提醒你重启AS(PS:Android Studio的简称)

重启之后我们再layout_main.xml文件中写一点东西


20200309160657230.png


<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/tv_test"
        android:text="Hello TV"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button 
        android:layout_marginTop="20dp"
        android:id="@+id/btn_test"
        android:text="TV"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>


布局很简单,纵向线性布局,里面是一个TextView和Button,然后我们换成横屏的布局预览效果


image.png


点击Preview就可以看到你的预览布局,然后点击那个下拉窗口,选择TV,


20200309161727210.png


TV有1920 X 1080和 1280 X 720两种尺寸的,这也是市面上常用的,当然你也可以通过custom来自定义,这里我们选择TV 720p的,这时候我们打开MainActivity.java文件,然后选中布局文件,鼠标右键,点击Generate生成也可通过快捷键 Alt + Insert


20200309162053247.png


然后会弹出一个小窗口


2020030916224592.png


点击之后会出现如下弹窗,可以实例化控件并控件添加点击事件,这里给按钮添加一个点击事件,然后我们看一下MainActivity.java中的代码,并在点击的时候弹出一个Toast消息


20200309162432653.png


MainActivity.java

package com.llw.androidtvdemo;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class MainActivity extends AppCompatActivity {
    @BindView(R.id.tv_test)
    TextView tvTest;
    @BindView(R.id.btn_test)
    Button btnTest;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }
    @OnClick(R.id.btn_test)
    public void onViewClicked() {
        //Toast 提示
        Toast.makeText(this,tvTest.getText().toString(),Toast.LENGTH_SHORT).show();
    }
}


这个时候你应该迫不及待的想要运行一下了吧,我们还有一步就是主题的设置


打开values下面的styles.xml文件


20200309163004687.png


我们不用它这个主题,重新创建一个


 <!-- Base application theme. -->
    <style name="AppTheme2" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>


styles.xml的完整代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="@style/Theme.Leanback" />
    <!-- Base application theme. -->
    <style name="AppTheme2" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>


然后你会发现少几个颜色,这时候我们在values文件夹下面创建一个colors.xml的文件

colors.xml代码如下:


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#008577</color>
    <color name="colorPrimaryDark">#00574B</color>
    <color name="colorAccent">#D81B60</color>
    <color name="tx_onclick">#1EBADE</color>
</resources>


然后就要使用我们新创建的主题了,打开AndroidManifest.xml文件


20200309163336567.png


修改,AppTheme,改成AppTheme2,然后运行项目.运行效果如下图


20200309163910231.png


这个时候你没有想过,我怎么点击这个按钮呢?电视机都是用遥控器的啊,遥控器又怎么操作呢?

这些问题一定在你的脑海里面环绕着,我们注意到,电视机使用遥控器,而我们的手机使用手指触摸点击,这个不能混为一谈,所以电视上需要用到焦点电视上都是通过控件获取焦点来实现点击效果的,我们在布局文件的button中写入


android:focusable="true"


意思就是可以获取到焦点,为false则不可获取焦点,

在代码里

btnTest.setFocusable(true);


为false则不可获取焦点。

在已知控件ID的情况下我们可以设置上下左右的移动控件,

    android:nextFocusUp="@id/tv_test"
        android:nextFocusDown="@id/tv_test"
        android:nextFocusLeft="@id/tv_test"
        android:nextFocusRight="@id/tv_test"


代码中:


    btnTest.setNextFocusUpId(R.id.tv_test);
        btnTest.setNextFocusDownId(R.id.tv_test);
        btnTest.setNextFocusLeftId(R.id.tv_test);
        btnTest.setNextFocusRightId(R.id.tv_test);


相关文章
|
21天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
46 19
|
21天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
49 14
|
24天前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
|
22天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
在数字时代,掌握安卓应用开发技能是进入IT行业的关键。本文将引导读者从零基础开始,逐步深入安卓开发的世界,通过实际案例和代码示例,展示如何构建自己的第一个安卓应用。我们将探讨基本概念、开发工具设置、用户界面设计、数据处理以及发布应用的全过程。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你提供宝贵的知识和技能,帮助你在安卓开发的道路上迈出坚实的步伐。
32 5
|
21天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
22天前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
22天前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
25天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
22天前
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
30 0
|
25天前
|
存储 监控 Java
探索安卓开发:从基础到进阶的旅程
在这个数字时代,移动应用已成为我们日常生活的一部分。对于开发者来说,掌握安卓开发不仅是技能的提升,更是通往创新世界的钥匙。本文将带你了解安卓开发的核心概念,从搭建开发环境到实现复杂功能,逐步深入安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的见解和技巧,帮助你在安卓开发的道路上更进一步。
22 0