十二、Android 中的数字视频:使用VideoView

在本章中,我们将利用在前一章中学到的数字视频概念、技术和格式的新知识,在我们自己的 Hello_World Android 应用中实际实现数字视频素材。

我们将在 TravelPlanet.java 活动子类中添加新的 Java 代码,以实例化 MediaController 对象,这样我们就可以在 VideoView 用户界面元素中播放视频,该元素是我们在本书前面的 activity_travel.xml 屏幕布局定义中设置的。

我们将介绍如何播放与源视频具有不同纵横比的视频,以及如何创建和添加视频传输控制用户界面元素。

使用 Android MediaController 类播放视频

因为我们已经在 FrameLayout 容器内的 activity_travel.xml 文件中添加并配置了 VideoView 用户界面元素,所以让我们打开我们在本书前面创建的 TravelPlanet.java Activity 类,并添加代码来实际播放我们的视频,现在我们已经将文件放在正确的资源文件夹/res/raw 中,可以开始播放了。

我们需要做的第一件事是为播放视频设置一个存储视频文件的路径,以便 Android MediaController 类可以找到它们,并最终播放它们。

这是通过统一资源标识符(【URI】)来完成的。URIs 在 Android 开发中如此重要,以至于有一个专门的类来定义和使用它们,叫做 Uri ,就像俄语名字一样。

Uri 在android.net包中,因为 URIs 经常被用来通过互联网访问数据,通常是通过我们都习惯使用的那个 HTTP:// 名字。你很快就会看到,要访问 Android 的资源文件夹中的东西,我们将使用 android.resource:// 路径访问定义。

Uri 类 是 java.lang.Object 类的子类,因此 java 中的 Uri 对象路径通过 android.net.Uri 向上通过 java.lang.Object。如果您对 android 开发者网站参考部分感兴趣,可以在以下 URL 找到有关 Uri 类的更多信息:

[http://developer.android.com/reference/android/net/Uri.html](http://developer.android.com/reference/android/net/Uri.html)

因此,让我们为我们的数字视频文件定义我们的 URI,使用 Uri 类的 parse( ) 方法,以及 getpackageName( ) 方法,它是 Android Context 类的一部分,该类也是从 java.lang.Object 子类化而来

在 TravelPlanet 活动中创建 Java videoUri 对象

让我们开始添加代码到我们的 TravelPlanet.java Activity 类,通过添加我们的第一行 Java 代码来设置将用于引用我们的视频数据的 URI。

让我们将定义视频 URI 的第一行代码放在活动的setContentView(r . layout . Activity _ Travel)方法调用的下面,该方法调用引用了我们对行星用户界面屏幕布局定义的访问。

设置我们的 Uri 对象的 Java 代码行的结构如下:

Uri videoUri = Uri.parse("android.resource://"+getpackageName()+"/"+R.raw.mars270);

这段相当密集的代码定义了我们的 Uri 对象,将其命名为 videoUri ,并将其设置为我们的【mars270.mp4】文件的 Uri,该文件位于我们的 /res/raw 文件夹中。

这是通过 Uri 类来实现的。parse( ) 方法,用于构造 Android 操作系统可以理解的有效 URI 对象,从而实现。

这里概述的 Uri.parse( ) 方法被传递了一个连接(通过 Java 语言+操作符完成),该连接是位于 android.resource:// 中的文件的位置与我们的 Hello_World 包名称和上下文的连接(通过 getpackageName( ) 方法获得),以及一个路径级别定义符,也称为正斜杠字符,最后是我们的资源标识符 R.raw.mars270,,这是我们的文件名(第一部分

你可以在图 12-1 中看到这一行代码,它就在我们已经在活动中编写的定义视频视图的代码行之前。

9781430257462_Fig12-01.jpg

图 12-1。将 Java 代码添加到我们的 TravelPlanet.java 活动中,为我们的视频视图实现 MediaController

因为我们已经定义了我们的 travelVideo VideoView 对象,并且引用了我们的 travelVideoView XML 用户界面元素定义,所以我们可以使用。setVideoURI( ) 方法,通过下面一行代码将我们新创建的 videoUri 对象连接到我们的 travelVideo VideoView 对象:

travelVideo.setVideoURI(videoUri);

这相当简单,我们通过videoUri 对象传递给 travelVideo VideoView 对象。setVideoURI( ) 方法,从而定义哪个数字视频数据文件用于我们的 VideoView,以及这个数字视频文件在我们的 Android 项目中的位置。

接下来,我们需要设置一个 Android MediaController 对象来完成数字视频文件的播放,所以接下来让我们开始吧。

创建 MediaController 对象来播放我们的数字视频

为了在 Android 中播放我们的数字视频文件,我们将利用 Android MediaController 类,它是 Androidframe layout类的子类。

请注意,我们使用 FrameLayout 来包含我们的 VideoView UI 元素(小部件),并且记住 FrameLayout 类是 ViewGroup 类的子类,View group 类本身又是 View 类的子类,View 类又是 java.lang.Object master 类的子类。

为了创建一个 MediaController 对象,让我们使用我们常用的对象实例化 Java 代码结构和 new 关键字,使用下面一行 Java 代码创建一个 videoMediaController (命名)MediaController 对象:

MediaController videoMediaController = new MediaController(this);

接下来我们要做的是告诉我们的 MediaController 对象我们希望它在哪里播放我们的视频。这是通过完成的。setAnchorView( ) 方法,定义哪个 Android 视图对象,在本例中,我们的 VideoView 对象名为 travelVideo ,我们希望将此 MediaController 对象的功能锚定到该对象。这是通过下面一行 Java 代码实现的:

videoMediaController.setAnchorView(travelVideo);

现在我们已经告诉我们的 MediaController 对象我们希望它在哪里播放我们的数字视频数据,但是我们仍然需要告诉我们的 travelVideo VideoView 对象访问哪个 MediaController 对象来播放数字视频数据。这是通过。setMediaController()方法,使用以下代码从 travelVideo VideoView 对象调用该方法:

travelVideo.setMediaController(videoMediaController);

既然我们的 travelVideo VideoView 对象和 videoMediaController 对象已经连接在一起,我们所要做的就是调用 travelVideo VideoView 对象的一些关键方法来控制数字视频数据的位置(Z 顺序)、焦点和回放,这样我们就完成了在 Android 应用中实现基本的视频回放。

在我们的 travelVideo 视频视图中控制视频播放

既然我们的 VideoView 对象和 MediaController 对象相互接口,我们可以调用 travelVideo 对象的一些关键方法,以确保我们的数字视频数据显示在屏幕层堆栈的前面(顶部),具有焦点以便可以播放,并开始播放。

我们需要调用的第一个方法是,通过使用 travelVideo 对象的点符号。bringToFront( ) 法。这确保了我们的 VideoView 位于任何其他用户界面元素之上,这些元素可能与 VideoView 一起在其布局容器中定义。完成此任务的 Java 代码如下所示:

travelVideo.bringToFront();

在开始视频回放之前,我们需要做的下一件事是确保视频视图具有焦点,这是我们在本书前面提到的概念。这是通过。requestFocus()方法,它通过请求焦点来确保 VideoView 获得焦点。这样,即使 VideoView 当前拥有焦点,调用该方法也能确保我们拥有焦点。这是通过下面一行 Java 代码完成的:

travelVideo.requestFocus();

最后,我们准备开始播放数字视频数据,使用。start()方法,您可能已经猜到了。这是通过以下代码行完成的,该代码行通过点标记法调用了 travelVideo 对象:

travelVideo.start();

现在是时候启动我们的 Nexus S 模拟器,并在 Android 软件模拟器中测试我们的数字视频文件播放。请注意,在实际的 Android 硬件设备上测试数字视频文件回放总是更好;然而,对于这本书来说,这是不可行的,因为有成千上万不同的制造商和型号,你们任何一个读者都可能有。

因为我们拥有的唯一基线是最新的 Eclipse ADT 及其各种软件模拟器,所以我们必须在测试中使用该解决方案。

在 Eclipse ADT 的 Nexus S 模拟器中测试视频回放

让我们启动我们的 Nexus S 模拟器,当你的 Hello World 主屏幕出现时,点击右边模拟器中的菜单按钮,然后选择前往行星活动屏幕,这样我们就可以看到我们的数字视频文件回放,结果如图图 12-2 所示。

9781430257462_Fig12-02.jpg

图 12-2。在 Nexus S 模拟器中播放 Mars 数字视频,并测试 onTouch()事件是否仍然有效

正如你所看到的,我们的数字视频保留了 16:9 的宽高比,即使在 5:3 宽高比的模拟器屏幕上,当我们点击视频屏幕时,我们会返回到我们的应用主屏幕,并显示回家祝酒信息。

因此,我们现在知道,我们现有的来自前几章的 Java 代码仍然可以工作。你可能注意到了,屏幕右侧有一个白条;这是因为布局容器的背景颜色未配置,默认为#FFFFFF 或白色值。您已经知道如何通过 FrameLayout 标记中的 android:background="#000000 "参数将它更改为黑色值。

您可能想知道:如果我想缩放这些数字视频数据以适合整个显示屏,会怎么样?这可能是一个选项,取决于它是什么类型的数据,以及主题对不均匀缩放或纵横比解锁的缩放的敏感程度。

我们正在使用的火星表面数据可以在用户没有察觉到主题材质变化的情况下进行缩放,而全屏人脸或说话的头部可能会看起来失真(肥胖或锥形)。

在 Android 中有一种方法可以实现这个最终结果,就是将 VideoView 用户界面元素放在 RelativeLayout 容器中,而不是使用 Framelayout 容器,这样可以保持纵横比。

用 RelativeLayout 容器而不是 FrameLayout 容器可以做到这一点的原因是,这两个不同的布局容器支持完全不同的 android:layout 参数。

使用相对布局缩放视频视图以适合屏幕

进入你的 activity_travel.xml 文件,将 FrameLayout 容器标签改为 RelativeLayout 容器标签,如图图 12-3 所示。

9781430257462_Fig12-03.jpg

图 12-3。更改 activity_travel.xml 屏幕布局,使用 Relativelatout 容器和 layout_alignParent 标签

在 RelativeLayout 容器中实现这一点的关键是使用 android:layout 参数,这些参数将数字视频文件的四个不同边与父容器对齐,在本例中是相对布局。我已经将这四个参数添加到我们的 VideoView 标签中,就在 android:id 参数之后,如图图 12-3 所示。

诀窍是将所有四个Android:layout _ align parent参数设置为值 true ,如以下 XML 标记代码所示:

android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"

这将拉伸 VideoView 容器的每一侧,以匹配 RelativeLayout 容器的两侧。因为在 android:layout_width 和 android:layout_height 参数中,RelativeLayout 标签被设置为 match_parent ,因此,无论 android 操作系统试图保持(锁定)数字视频宽高比的正确倾向如何,参数设置都会强制 VideoView 填充屏幕。结果如图图 12-4 所示。

9781430257462_Fig12-04.jpg

图 12-4。在 Nexus S 中测试我们的 relative layout layout _ align parent 标签

接下来,我们需要在 Nexus S 模拟器中测试 Travel to a Planet 活动,以确保一切正常。数字视频全屏播放,触摸屏幕会将我们的最终用户带回到主屏幕,就像我们在本书前面对该功能进行编码一样。

然而,有一个重要的问题对于 Android 新手来说可能不是很明显,那就是触摸视频应该会启动媒体控制器传输。视频传输是一组用于播放、暂停或浏览数字视频内容的基本用户控件。

目前,我们的 onTouch()事件处理阻止了我们的最终用户访问这个媒体控制器传输 UI 元素,因此,我们需要向我们的 UI 添加一个按钮 UI 元素,并将其与 onClick()事件处理程序连接起来,以释放触摸屏。这样,Android 的 MediaController 可以在屏幕被触摸时显示其传输实用程序。

修改我们的界面以支持媒体控制器传输

因此,我们需要做的第一件事是删除 onTouch( ) Java 代码,以确保我们可以访问 MediaController 传输控件。简单的方法是使用 Java 中的双正斜杠代码注释功能,临时注释掉这个代码块,第一行代码如下所示:

// travelVideo.setOnTouchListener(new View.OnTouchListener() {

这显示在图 12-5 的中,以及其他注释代码。

9781430257462_Fig12-05.jpg

图 12-5。删除干扰 MediaController 传输 UI 元素的 onTouch()事件处理

正如您所看到的,Eclipse 会立即在不再需要的三个 import 语句旁边显示警告标志,因为这段代码的注释已经将它从 Eclipse Java 编译器的“视图”中删除了。

因为 Eclipse 中的警告不会阻止我们在 Nexus S 模拟器中运行我们的应用,所以让我们使用熟悉的 Run As Android 应用工作流程,看看我们是否可以在触摸我们的视频屏幕时显示媒体控制器传输。

正如你在图 12-6 中看到的,当我们在模拟器中触摸屏幕时,我们现在可以访问视频传输控件。然而,我们现在没有办法回到我们的主屏幕,所以我们需要添加一个用户界面元素来实现这一点。幸运的是,我们只是在一个 Android 模拟器中处于测试模式,这个模拟器的右上角有一个红色的 X 关闭图标,我们可以用它来退出!

9781430257462_Fig12-06.jpg

图 12-6。点击或触摸屏幕即可调出媒体控制器传输

接下来,让我们在屏幕右上角的视频顶部添加一个按钮用户界面元素,它允许我们的用户退出 Travel to Planet 活动屏幕并返回到我们的 Hello World 应用主屏幕。

添加一个按钮 UI 元素让我们返回主屏幕

在 Eclipse 中找到并打开你的 activity_travel.xml 编辑标签,在 < VideoView > 标签下添加一行空格,然后按 < 键调用添加新标签助手对话框。找到按钮标签,如图图 12-7 所示,双击将标签添加到< RelativeLayout >容器中。现在我们准备添加参数来配置我们的按钮标签。

9781430257462_Fig12-07.jpg

图 12-7。向 activity_travel.xml 屏幕布局定义文件添加一个按钮用户界面元素标签

首先,我们需要给我们的按钮 UI 元素一个 ID,以便我们可以在 Java 代码中引用它,所以使用 android:id 参数,并通过 android:id="@+id/travelButton "参数标记将按钮命名为 travelButton。

接下来找到您的 strings.xml 文件,为名为 travel_button_caption 的按钮添加一个 < string > 常量,值为 Return to Home Screen ,如下所示:

<string name="travel_button_caption">Return to Home Screen</string>

使用 android:text 参数来引用这个字符串常量,同时确保添加必需的 android:layout_widthandroid:layout_height 参数,这两个参数都设置为 wrap_content 常量值。

因为我们希望按钮在屏幕的右上角,不要挡住我们的视频内容,所以让我们使用Android:alignParentTop = " true ",以及Android:alignParentRight = " true "参数来实现这个最终结果。

最后,让我们将我们的按钮背景颜色设置为白色,并通过为 android:background 参数使用八个字符(AARRGGBB)的十六进制值为其赋予半透明的 alpha 值,如下所示:

android:background="99FFFFFF"

到目前为止,我们的按钮标记的 XML 标记应该如下所示:

<Button android:id="@+id/travelButton"
        android:text="@string/travel_button_caption"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:alignParentTop="true"
        android:alignParentRight="true"
        android:background="#99FFFFFF" />

整个 RelativeLayout XML 容器标记如图 12-8 所示。

9781430257462_Fig12-08.jpg

图 12-8。配置我们的按钮标签参数,在屏幕右上方放置一个透明的 UI 按钮

现在是时候使用 Nexus S 模拟器再次测试我们的应用了,看看我们是否有一个媒体控制器传输 UI 元素,以及一个退出按钮 UI 元素,用于我们到行星活动屏幕的旅行。

调用作为 Android 应用运行菜单序列并启动 Nexus S 仿真器。当您的应用启动时,单击菜单按钮并选择“旅行到星球”选项,然后转到该活动屏幕。

正如你在图 12-6 中看到的(这里不需要复制截图)视频播放,点击或触摸屏幕会调出传输控件,但是按钮 UI 元素没有覆盖在视频的右上角,所以有些不对劲。

我做的第一件事,看看我是否能纠正这个问题,就是在按钮标签中键入 android: ,看看我是否能找到一个 z 顺序参数。

z-order 参数会将按钮带到层顺序的顶部,以便按钮显示在视频的顶部,就像我们希望的那样。唉,目前还没有这样的参数,所以我们必须想出另一种方法,通过一些巧妙的标签参数工作来接近我们正在寻找的 UI 结果,很可能是在和标签中。

故障排除 我们的 VideoView 用户界面设计

让我们看看我们的代码,看看可以做些什么来让我们的顶部安装按钮在我们的数字视频素材的顶部可见。看起来 android:layout_alignParentTop 参数正在将 VideoView UI 元素拉至屏幕顶部,并覆盖在按钮 UI 元素上。

因为没有可用的 android:z-order 参数,所以我尝试的第一件事是在 RelativeLayout 中的 VideoView 标签之前剪切并粘贴按钮标签,以查看布局容器中的顺序是否影响 z-order。

当我在模拟器中测试它时,这不仅没有解决问题,还产生了一个运行时错误。然后,我恢复了之前的标签顺序,并寻找解决这个问题的另一种方法。如果我不能将这个按钮 UI 元素放在 VideoView 的顶部,我接下来会尝试将它直接放在 VideoView UI 元素的顶部,并与之连接。

我尝试的下一件事是Android:layout _ alignParentTop参数从 VideoView 标签移动到 Button 标签,然后将 android:layout_below 参数添加到 VideoView,在我删除 alignParentTop 参数的地方,因此在< VideoView > :" 中查找以下参数

android:layout_below="@+id/travelButton"

这都显示在图 12-9 中。

9781430257462_Fig12-09.jpg

图 12-9。添加按钮标签参数,将按钮元素放置在屏幕顶部,并将其置于 VideoView 的中央

然后,我再次使用我的运行 Android 应用工作流程来启动 Nexus S 模拟器,看看这是否解决了问题,正如你在图 12-10 的左侧看到的,它确实解决了问题。然而,现在我们的背景颜色和透明度设置与我们 UI 的外观和感觉不匹配。

9781430257462_Fig12-10.jpg

图 12-10。在 VideoView UI 元素的基础上,测试和改进我们的“星球之旅”UI 屏幕按钮元素

因此,让我们将我们的 android:background 参数更改为黑色或 #000000 ,以便它与应用顶部使用的其他颜色相匹配。

接下来,我们需要建立一个与我们的火星大气相匹配的文本颜色,并为我们提供与黑色背景颜色的高对比度,所以让我们使用之前在 android:textColor 参数中使用的橙色值#FFDDBB,如图 12-9 所示。

在进行这些更改时,一定要使用位于 Eclipse 中 XML 编辑器底部的图形化布局编辑器标签,这样您就可以了解这些标签对您的用户界面设计有什么影响。举例来说,你会注意到,我们的文本,现在我们实际上可以看到,实际上太小了,需要变大。

所以,让我们添加一个 android:textSize="28sp" 参数,并确保我们的文本是漂亮和大的。请记住,文本(字体)使用标准像素(SP)作为它们在 XML 标签中的表示,而不是像其他图形或用户界面元素那样使用密度像素(DP)。现在,我们已经准备好使用我们的作为 Android 应用运行工作流程,并在 Nexus 模拟器中检查我们的新用户界面屏幕。结果如图 12-10 右侧所示,如你所见,我们的文本现在可读了,设计也匹配了。

接下来,我们需要将 Java 代码添加到我们的 TravelPlanet.java 活动类中,这样我们就可以实例化新的按钮用户界面元素,从而使它起作用,这样我们的用户就可以单击它返回到主屏幕。

在 Java 代码中增加了返回地球的按钮

让我们在我们的 travelVideo.start( ) 方法调用下添加一行新代码,并实例化我们的按钮用户界面元素。我们将其命名为 travelButton ,并使用下面的代码行将其引用到我们的 XML 参数:

Button travelButton = (Button)findViewById(R.id.travelButton);

接下来,我们将修改 TravelPlanet.java 活动中被注释掉的代码,将其从附加到 VideoView UI 元素的 onTouch()事件处理场景更改为附加到 Button UI 元素的 onClick()事件处理场景。注释掉的代码显示在图 12-5 中,而所有修改后的代码显示在图 12-11 中。

9781430257462_Fig12-11.jpg

图 12-11。添加我们的 travelButton Java 代码来实例化一个按钮 UI 元素并附加 onClick()处理程序

因此,使用以下代码,将您的travel video . setontouchlistener()方法更改为travel button . setonclicklistener()方法调用:

travelButton.setOnClickListener(new View.OnClickListener() {new code goes in here}

我们需要做的下一件事是删除剩余的双斜线注释字符,这样我们就可以修改 OnClickListener( ) 方法的内部,将 onTouch( ) 方法及其内容改为 onClick()方法。新的 onClick( ) 代码应该如下所示:

@Override
public void onClick(View v) {
         Toast.makeToast(TravelPlanet.this, "Going Home", Toast.LENGTH_SHORT).show();
         finish();
}

请注意,图 12-5 截图中显示的三个警告突出显示中的两个已经消失,现在我们已经在新的 onClick( ) Java 代码中使用了视图吐司类对象。因为 MotionEvent 类与我们已经移除的 onTouch()事件处理一起使用,所以您可以继续删除这个 import 语句,您的 Java 代码现在将没有错误和警告,并准备好在您的 Nexus 模拟器中进行测试。使用 Run As Android Application 菜单序列在 Nexus S 模拟器中运行你的 Hello_World 应用,并测试功能,如图图 12-12 所示。

9781430257462_Fig12-12.jpg

图 12-12。测试我们的按钮用户界面元素和媒体控制器传输

我现在能看到的关于“去行星旅行”活动用户界面的唯一问题是用户体验 UX 设计的问题。

问题是,我们在屏幕顶部添加的按钮 UI 元素看起来像是屏幕的标题,而不是可以单击的按钮。这对于你来说似乎很小,但是对于一些认为屏幕顶部是一个标题而不是一个按钮的用户来说,这种假设会把他们困在这个屏幕上,没有办法回到主屏幕。所以,让我们解决这最后一个 UX 问题,我们将在这里完成!

微调我们的星球旅行用户体验设计

为了突出顶部居中的按钮是一个按钮而不是标题,我们需要在它周围放置一个边框,这样它看起来更像一个按钮。我做的第一件事是在我的按钮标签中键入 android: ,并在助手对话框的可用参数列表中查找 android:border 参数。令人惊讶的是,没有这样的选择,所以我不得不变得有创意,想出其他的东西来达到同样的视觉效果。XML 标记代码如图图 12-13 所示。

9781430257462_Fig12-13.jpg

图 12-13。使用带有按钮边距参数的 RelativeLayout 背景创建一个按钮边框效果

我所做的是为父 RelativeLayout 容器设置一个Android:background = " # FFDDBB "标签参数。因为我们的 VideoView UI 元素充满了屏幕,所以我可以有效地使用背景色(我匹配了 android:textColor 参数值)在按钮周围创建一个漂亮的边框,还可以使用Android:Layout _ margin = " 4dp "参数将按钮 UI 元素的黑色背景拉得足够大,让这个相对布局背景色显示出来,并成为我的按钮的边框!

现在让我们使用作为 Android 应用运行的工作流程,看看我们的按钮现在看起来和行为是否更像一个按钮,而不是屏幕标题。

正如你在图 12-14 中看到的,活动用户界面屏幕顶部的按钮现在看起来更像是一个按钮,而不是一个屏幕标题,点击按钮会让用户返回到主屏幕,点击数字视频会显示一个 Android Media Controller 传输控制栏,所以两者现在都工作得很好。

9781430257462_Fig12-14.jpg

图 12-14。测试旅行到星球 UI 屏幕和带边距边框的按钮

在第 13 章中,我们将了解视频的另一部分,即音频,以及如何为您的 Android 应用创建、操作、压缩、编码、优化和处理音频。在我们学习了关于音频的基本概念和技术后,我们将开始把它整合到我们的应用中。

摘要

在涵盖数字视频的这一章中,我们仔细研究了如何在 Hello World Android 应用 XML 和 Java 代码以及用户界面和用户体验设计中融入我们在上一章中了解到的数字视频概念和素材。

我们学习了 Android MediaController 类,它用于在我们的 Android 应用中播放数字视频文件。我们学习了如何使用 Uri 类和 Uri.parse( ) 方法以及 getPackageName( ) 方法创建一个统一资源标识符对象,或 URI 对象。

然后,我们为 TravelPlanet.java 活动类编写 Java 代码,通过实例化名为视频媒体控制器的新对象来实现媒体控制器类,然后通过使用将媒体控制器对象锚定到 travelVideo 视频视图对象。setAnchorView( ) 方法。

然后我们通过调用完成了 MediaController 到 VideoView 的连接。setMediaController( ) 方法使用 videoMediaController 对象引用关闭我们的 travelView VideoView 对象。完成后,我们就可以使用 travelView 对象设置数字视频播放了。

我们调用了几个视图类方法来设置我们的数字视频回放,首先使用将视图放到最前面。bringToFront( ) 方法,然后通过调用来确保它有焦点。requestFocus( ) 方法。然后我们开始使用播放我们的 MPEG4 数字视频文件。start( ) 方法,并在 Nexus S 仿真器中测试了我们的程序逻辑。

接下来,我们进行了一些故障排除,以了解为什么我们没有在 VideoView UI 元素的底部获得 MediaController 传输条。

我们需要用一个按钮 UI 元素替换我们的 onTouch()事件处理,并实现 onClick()事件处理,以便我们的 VideoView 可以捕获 onTouch()事件并显示 MediaController 传输控制小部件。

最后,我们对用户界面设计做了一些微调,添加了一些影响按钮颜色的参数,增加了对比度,并与应用的外观和感觉相匹配。我们还在按钮 UI 对象周围添加了一个细边框,这样它就不会以屏幕标题的形式出现在最终用户面前,这可能是用户体验设计的一个错误。

在下一章,我们将了解 Android 操作系统支持的另一种主要新媒体类型:数字音频。我们将学习数字音频背后的核心数字音频概念、设计原则和制作技术,以及用于在我们的 Android 应用中实现数字音频的文件格式和编解码器。我们将了解开源音频编辑软件包 Audacity,以及如何使用它来创建用于 Hello World Android 应用的音频素材。