美文网首页androidAndroid TVAndroid TV
[译]简介--Android TV 应用开发教程一

[译]简介--Android TV 应用开发教程一

作者: wenju_song | 来源:发表于2017-04-10 08:46 被阅读6505次

    版权声明:本文为博主原创翻译文章,转载请注明出处。

    推荐:
    欢迎关注我创建的Android TV 简书专题,会定期给大家分享一些AndroidTv相关的内容:
    http://www.jianshu.com/c/37efc6e9799b


    androidtvapptutorial6-800x450.png

    Android TV 应用开发介绍

    目前,我们还没有足够的Android TV应用开发介绍。 在本系列教程中,我将介绍如何开发Android TV应用程序。
    这篇文章的目的是了解Android“TV”特定的代码实现,特别是关注UI实现。

    因为UI是Android手机应用和Android TV应用之间最大的区别之一。 我们需要使UI适合电视使用,例如我们应该制作一个应用程序,以便我们可以使用↑↓→←方向键导航应用程序,而不是触摸板导航。 因为用户使用遥控器,并且不能用电视机使用“触摸屏”功能。 为了实现这一要求,Android开源项目正在提供Leanback支持库(android.support.v17.leanback),以便开发人员可以轻松实现满足这些要求的UI,从而适合电视使用。 本教程主要讲述了Leanback库的用法。

    这个帖子的目标是那些谁:

    • 之前开发过Android应用,但不熟悉Android TV应用。
    • 开发者 - 中级

    Google从2015年底对Eclipse不再支持,所以请用Android studio用于IDE开发Android TV应用程序(如果你还没有使用,请下载并安装Android studio)。 请注意,这里介绍的大部分代码来自AOSP android TV示例源代码leanback。 本教程基本上只是这个示例源代码的详细说明。 让我们开始。

    开始编写一个Android TV 应用

    1.打开Android studio

    New Project

    应用名称: AndroidTVappTutoria


    androidtvapptutorial1.png

    指定Android设备


    androidtvapptutorial2.png
    将activity添加到电视
    androidtvapptutorial3.png

    选择“Add No Activity”并完成

    Android studio会自动生成源代码。

    此阶段的源代码上传到github

    2.添加activity

    首先,让我们开展活动。 右键单击“com.corochann.androidtvapptutorial”,然后选择

    New -> Activity -> Blank activity

    点击 “Launcher Activity”。

    我将从空白活动开始,名为“MainActivity”。该Activity继承Activity,而不是AppCompatActivity。

    Android studio现在生成2个文件,Java class&layout / activity_main.xml。 (我们不使用res / menu / menu_main.xml)

    *注意:我们还发现有一个 “Android TV activity”选项。 当选择它时,它将同时创建太多的文件。 这是一个非常有用的参考,但很难理解每个文件处理什么样的功能。 所以我将在这篇文章中从头开始创建这些文件,以便我们能够理解每块代码的责任。 这篇文章中的许多实现都是引用这个官方的示例程序。
    接下来,我们要通过创建MainFragment来设计MainActivity的UI。

    3.添加 fragment

    右键单击包名称(在我这里是com.corochann.androidtvapptutorial)
    New -> Java Class -> Name: MainFragment
    *除了上述过程,如果我们选择New - > Fragment - > Blank fragment,请取消选中“Create layout XML?”,不取消的话会创建太多的样例代码。
    首先,修改activity_main.xml,如下所示,只显示mainfragment。

    <?xml version="1.0" encoding="utf-8"?>
    <fragment 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:id="@+id/main_browse_fragment"
        android:name="com.corochann.androidtvapptutorial.MainFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        tools:context=".MainActivity" 
        tools:deviceIds="tv"
        tools:ignore="MergeRootFrame" />
    

    然后,修改MainFragment如下。

    我们将这个MainFragment作为BrowseFragment的子类。

    BrowseFragment类由Android SDK Leanback库提供,它为Android TV应用程序创建了标准UI,我们将在本教程中看到。

    package com.corochann.helloandroidtvfromscrach;
    
    import android.os.Bundle;
    import android.support.v17.leanback.app.BrowseFragment;
    import android.util.Log;
    
    public class MainFragment extends BrowseFragment {
        private static final String TAG = MainFragment.class.getSimpleName();
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            Log.i(TAG, "onActivityCreated");
            super.onActivityCreated(savedInstanceState);
    
        }
    }
    

    4.修改Android Mainifest文件:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest package="com.songwenju.androidtvapptutoria"
              xmlns:android="http://schemas.android.com/apk/res/android">
    
        <!-- TV app need to declare touchscreen not required -->
        <uses-feature
            android:name="android.hardware.touchscreen"
            android:required="false"/>
    
        <!--
         true:  your app runs on only TV
         false: your app runs on phone and TV -->
        <uses-feature
            android:name="android.software.leanback"
            android:required="true"/>
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/Theme.Leanback">
            <activity
                android:name=".MainActivity"
                android:icon="@drawable/app_icon_your_company"
                android:label="@string/app_name"
                android:logo="@drawable/app_icon_your_company">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
    
                    <category android:name="android.intent.category.LAUNCHER"/>
                    <category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    有以下几点注意事项:
    1)这里要设置touchscreen为false,即TV app 不需要触摸。

    <uses-feature
            android:name="android.hardware.touchscreen"
            android:required="false"/>
    

    2)设置依赖leanback库相关。

    <uses-feature
            android:name="android.software.leanback"
            android:required="true"/>
    

    仅仅在TV上运行设置为true,在TV和phone上运行设置为false。
    application的主题

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/Theme.Leanback">
    

    显示Activity icon 在普通桌面和Leanback桌面。在 intent-filter中声明。

      <category android:name="android.intent.category.LAUNCHER"/>
      <category android:name="android.intent.category.LEANBAC
    

    同时添加icon和logo在activity的tag上,

     <activity
                android:name=".MainActivity"
                android:icon="@drawable/app_icon_your_company"
                android:label="@string/app_name"
                android:logo="@drawable/app_icon_your_company">
                ...
    
    
    manifest_activity.png

    到此运行一下应用,运行结果如图:

    androidtvapptutorial5.png

    可以看到BrowseFragment由HeadersFragment&RowsFragment组成。
    在这里,可以在右侧看到HeaderFragment(header)部分,在左侧看到RowsFragment(contents)部分。 我们将在下面设计这个Header&Row组合。

    在此之前,让我们来实现这个应用程序的主要颜色和标题的UI。

    5.在MainFragment.java上添加setupUIElements()

    在MainFragment.java中添加setupUIElements()方法,以设置应用程序信息。

     @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            LogUtil.i(this,"MainFragment.onActivityCreated.");
            super.onActivityCreated(savedInstanceState);
            setupUIElements();
    
        }
    
        private void setupUIElements() {
    
    //        setBadgeDrawable(getActivity()
    //                .getResources()
    //                .getDrawable(R.drawable.app_icon_your_company));//展示在标题栏上的图片(图片会隐藏标题)
    
            setTitle("Hello Android TV!");  //设置title
    
            //HEADERS_ENABLED 显示左侧导航栏,HEADERS_DISABLED 不显示 HEADERS_HIDDEN 隐藏,到边缘按左键还能显示
            setHeadersState(HEADERS_HIDDEN);
            setHeadersTransitionOnBackEnabled(true);
            
            // 设置快速导航(或 headers) 背景色
            setBrandColor(getResources().getColor(R.color.fastlane_background));
            // 设置搜索的颜色
            setSearchAffordanceColor(getResources().getColor(R.color.search_opaque));
        }
    

    我们已经设置了

    • 应用的title或者图标
    • 左侧颜色

    颜色信息是从colors.xml引用的,我们还没有提供。 右键单击res / values并选择

    新建 - >values资源文件
    文件名:colors.xml - >“OK”

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <color name="fastlane_background">#0096e6</color>
        <color name="search_opaque">#ffaa3f</color>
    </resources>
    

    运行之后可以看到颜色发生了变化。


    androidtvapptutorial6.png

    你也可以使用setBadgeDrawable()方法而不是setTitle()方法,如果使用了setBadgeDrawable(),标题将更改为logo(见下图)。


    AndroidTVsampleApp-2015-07-01-150913-1024x576.png

    下一篇博客,将构建BrowseFragment - Android TV应用程序手册教程二,将介绍BrowseFragment,HeadersFragment,RowsFragment,Adapter和Presenter的概念,在我们的应用程序中可展示一些可选对象。
    关注微信公众号,定期为你推荐移动开发相关文章。

    songwenju

    相关文章

      网友评论

      • qq1091192337:请问一下,我在 Android Studio建立项目的时候我直接选择的TV Activity,然后完成后能编译成功,我直接打包成APK (发布版),安装在电视上,怎么打不开呢。
      • 拿着号码牌徘徊:Error:(32) error: resource drawable/app_icon_your_company (aka com.corochann.androidtvapptutoria:drawable/app_icon_your_company) not found.
        drawable里的文件哪里有
      • 白首不分离_355e:您好,想请教下Android TV 语音识别这块是如何实现的? 把手机上的代码放在TV盒子上跑不起来 。我是在华为盒子上开发,它本身自带了语音识别,不清楚他是如何实现的
        wenju_song: @白首不分离_355e 语音识别我的理解是调用相关的接口,首先要有相应的硬件模块。我没有开发这一块。我知道的是我们的语音是在思必驰的语音模块,百度提供的语音数据。
      • Noti:Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v17.leanback.app.HeadersFragment.setAlignment(int)' on a null object reference 问下这个怎么处理额,谢谢啦
        wenju_song:@搞出一片天 debug一下
        Noti:@wenju_song 新手额
        wenju_song:@搞出一片天 空指针异常应该好找到原因吧
      • 8f09a663a3fa:请问一下,Android TV模拟器怎么搭建的?我搭建了两次,都被kill了
        8f09a663a3fa: @wenju_song 谢谢,已解决,SDK路径存在空格
        wenju_song: @Possible_9fa2 报什么错?
      • DerrickRos_3a62:问下,Android tv 默认启动的第一个应用在哪里?不是lanucher吧,麻烦告知一下首页内容的代码在哪一块
        wenju_song:整个tv启动第一个应用是launcher啊,在AndroidManifest可以配置

      本文标题:[译]简介--Android TV 应用开发教程一

      本文链接:https://www.haomeiwen.com/subject/uuohottx.html