使用 App Inventor 进行 Android 编程

作者:Amit Saha

通过拖放的方式进行 Android 编程。

MIT App Inventor 是一个可视化编程语言,用于开发 Android 移动计算平台应用程序。它由 MIT 移动学习中心重新发布为 Beta 服务(截至 2012 年 3 月 5 日),此前该项目由 Google 负责。它基于块的概念,应用程序通过将代码片段块拼接在一起进行设计。对于《Linux Journal》的资深读者来说,这听起来可能是一种非常幼稚的编程方式。但话又说回来,App Inventor 将会唤醒你内心的孩子气程序员,并让你对开发 Android 设备应用程序的轻松程度感到高兴。在本文中,我将介绍如何使用 Android 设备上的摄像头、开发基于电子邮件和短信的应用,并展示如何使用位置传感器来检索您当前的地理位置。让我们开始吧。

入门指南

App Inventor 的最低设置要求,并且完全基于浏览器。您的系统需要安装可用的 Java,因为它使用 Java Web Start 来运行。将您的浏览器指向 http://appinventor.mit.edu,一旦您使用您的 Google 帐户登录,您应该会看到如图 1 所示的屏幕。这就是项目页面,您可以在其中查看您现有的项目并创建新的项目。

图 1. App Inventor 的项目页面

现在,让我们使用 App Inventor 开发和部署一个 Android 应用程序,并在过程中学习基本的开发-部署周期。使用“新建项目”按钮创建一个新项目,并输入您的项目名称,例如“Project1”。现在您应该看到您的项目的设计器窗口。设计器窗口由四个子组件组成。“调色板”位于窗口的最左侧,是您项目的所有可用组件的占位符。“查看器”是应用程序的设计位置,通过将各种组件放置在一起进行设计(您可以在此处设计应用程序的用户界面)。“组件”显示您项目中当前使用的组件,“属性”列是您在其中分配组件属性的地方。

首先,让我简要解释一下组件的概念。App Inventor 项目由称为组件的构建块组成,例如用于显示文本的文本标签、用于接收用户输入的文本框、用于拍摄照片的摄像头组件等等。目前,您将看到几个组件类别——基本组件,例如用于用户输入和文本显示的组件;更专业的组件,例如用于显示媒体和动画的组件;以及充当设备传感器接口的组件。所有组件的完整参考可在 http://appinventor.mit.edu/learn/reference/index.html 获得。组件具有相关的行为、方法和属性。某些属性可以设置;而其他属性只能读取。

在第一个项目中,让我们使用以下组件:摄像头、按钮和图像。代码通常能更好地说明问题,但这里简要介绍一下您将要做的事情:单击按钮启动设备上的摄像头,您可以使用它来拍摄照片,然后使用图像组件显示照片。以下是步骤

  1. 从调色板中将摄像头组件拖动到查看器。它应该显示在查看器下方的“非可见组件”下方。默认情况下,它将被命名为 Camera1,当然,您可以将其更改为其他名称。

  2. 将一个按钮拖动到查看器,并从“属性”中将其文本更改为“点击”。

  3. 将一个图像组件拖到查看器上。

  4. 您可以摆弄屏幕属性来设置标题、背景颜色和方向等内容。对于此项目,将标题设置为“点击!”。

图 2. Project1 的用户界面

这样就完成了用户界面的设计(图 2)。接下来,让我们使用块来编程组件。

打开块编辑器,它应该开始下载编辑器的 JAR 文件。如果您没有将 App Inventor 安装命令安装在 /usr/google 下的标准位置,它会询问您 App Inventor 安装命令的位置。当前项目的块编辑器将如图 3 所示。回到该项目的描述,目标是在单击按钮时激活设备摄像头。这是通过代码块“当 Button1.click”完成的,该代码块是从左侧的“块”窗格中拖出的。当按钮被单击时,您希望激活设备的摄像头,因此将“调用 Camera1.TakePicture”块拖到前面的块内。拍摄照片后,您将希望使用图像组件显示照片。因此,将块“当 Camera1.AfterPicture”插入编辑器,然后将“Image1.Picture”设置为保存图像的位置。

图 3. Project1 的块编辑器

现在您已经设计了用户界面并编程了应用程序的逻辑,您已准备好对其进行测试。返回到设计器窗口,然后在右侧单击“打包为手机”→“下载到此计算机”。这将启动您的项目的 Android 包(.apk 文件)的下载。现在,将此文件传输到您的 Android 设备并安装它。然后,试用一下。

内幕一览

现在您已经设计和部署了您的第一个 Android 应用程序,并且您使用了组件(摄像头组件和图像组件),为它们分配了行为并设置了属性。如果您熟悉事件驱动编程的概念,您已经意识到 App Inventor 是一个事件驱动编程框架。事件可以是用户单击按钮或接收到短信。例如,当按钮被单击时,据说发生了一个事件,并且响应此事件,摄像头被激活。同样,当摄像头完成拍摄照片并保存照片时,响应代码使用图像位置来使用图像组件显示照片。

早些时候,我提到组件具有相关的行为、方法和属性。您可以通过在块编辑器中单击组件来找到这些组件。例如,图 4 显示了摄像头组件的可用方法 (Camera1.TakePicture) 和行为 (Camera1.AfterPicture)。

图 4. 摄像头组件的可用块

除了与组件关联的块之外,还有更基本的编程块可用:数学块、逻辑块、控制块和其他块。(我将在本文后面的一个项目中演示使用其中的一些。)

现在您已经对使用 App Inventor 开发应用程序有了基本的了解,让我们稍微了解一下它的内部原理,从源代码开始。通过转到项目页面并选择 Project1 并单击“更多操作”→“下载源代码”,下载“Project1”的源代码。这将开始下载 zip 文件中的源代码。当您解压缩该文件时,您将有两个目录:src 和 youngandroidproject。在 src 目录下,您将有一个名为 appinventor 的子目录,其中包含子目录,然后是 ai_droidery/Project1(请注意,“droidery”是我的 Google 用户名)。在此目录中,您将看到源文件 Screen1.blk、Screen1.scm 和 Screen1.yail。Screen1.blk 是先前创建的可视化块的基于 XML 的表示形式;Screen1.yail 是 App Inventor 使用的基于 Scheme 语言的中间语言,然后将其馈送到 Kawa 以创建用于安装在 Android 设备上的 Android 包。Screen1.scm 文件是项目中使用的组件的 JSON 表示形式,其中包含有关组件的详细信息,例如版本信息。如果您热衷于了解 App Inventor 的真正工作原理,您可能还想查看 App Inventor 的源代码(请参阅资源)。

接下来,让我们继续熟悉传感器和 App Inventor 中提供的一些其他组件。

使用传感器感知世界

顾名思义,传感器是 Android 设备的眼睛和耳朵。它们使您的设备能够感知周围的世界。例如,您设备上的位置传感器使用您的手机和 Wi-Fi 信号信息以及 GPS 数据来跟踪您当前的位置信息。您 Android 设备上的其他传感器包括接近传感器和运动传感器。在本节中,让我们使用您 Android 设备上的位置传感器编写两个简单的应用程序,它们可以单独使用,也可以作为更实用和定制化的应用的起点。在此过程中,您将学习使用更多 App Inventor 组件。

通过电子邮件发送您当前的位置

考虑一个并非虚构的场景,您可能想告诉您的朋友您此刻的确切位置,以便她可以开车来找您。或者,您可能只是迷路了。无论哪种方式,位置传感器都可以提供帮助。让我们将此项目称为“LocationOnClickEmail”。此项目的用户界面如图 5 所示。除了基本组件(如文本标签和按钮)外,还添加位置传感器组件(在“传感器”类别下找到)和 ActivityStarter 组件(在“其他内容”类别下找到)。ActivityStarter 组件已命名为“MailAppStarter”,将用于启动 Android 设备上的电子邮件应用程序。有关 ActivityStarter 组件的详细信息,请参阅 http://appinventor.mit.edu/learn/reference/other/activitystarter.html

图 5. LocationOnClickEmail 项目的用户界面

现在您需要像以前一样使用块编辑器添加项目逻辑。图 6 显示了此项目的块编辑器的最终状态。

图 6. LocationOnClickEmail 项目的最终块

应用程序逻辑可以分为两个步骤——在单击“获取位置”按钮时使用位置传感器获取位置。这在“当 GetLocationButton.Click”代码块中完成。当单击此按钮时,将启用位置传感器。一旦位置传感器能够获取位置信息,它就会调用“当 LocationSensor1.LocationChanged”方法,在该方法中,文本标签会使用位置数据进行更新。接下来,当单击“电子邮件位置”按钮时,MailAppStarter 组件的 DataUri 属性将设置为启动邮件应用程序。在此处,收件人设置为“droidery@gmail.com”,主题设置为“我的位置”,消息正文设置为获取的地址。收件人和主题可以在设备上的邮件应用程序中更改。

这样就完成了当前项目。有关使用位置传感器和 App Starter 组件的更多详细信息,请参阅 App Inventor 参考(请参阅资源)。

基于短信的位置传感器应用程序

在最后一个应用程序中,您启动了位置发送事件。如果您想设计一个作为服务运行的应用程序,以便在收到短信请求时,它将您的当前位置发送给发送者,该怎么办?即使在当今互联世界中,隐私是一个如此敏感的问题,但如果您想确保您尚未成年的孩子没有迷路,例如,这样的应用程序也可能很有用。除了位置传感器组件外,您还将在此应用程序中熟悉短信组件。

这是一个想法:在收到正文包含“location”的短信时,应用程序会回复一条包含当前位置的短信。收到短信后采取的操作如图 7 所示。这是应用程序的核心逻辑。在“Texting1.MessageRecieved”过程中,“number”和“messageText”作为参数可用。如果“messageText”是“location”,则检查是否已获取位置。如果已获取,则使用地址构造回复并发送短信;否则,发回错误消息作为回复。

图 7. 收到短信时采取的操作

完整的应用程序以及其他应用程序可以从 https://bitbucket.org/amitksaha/articles_code/src 下载。您可以将源 (.zip) 存档直接上传到 App Inventor 并打包应用程序后试用这些应用程序。在本文中,我严格专注于使用 Android 设备测试应用程序。对于基本用途,您还可以使用 App Inventor 中提供的模拟器,并使用实时开发方法,您可以将应用程序直接安装到您的设备。请参阅 App Inventor 网站以试用这些方法。我在运行 Android 2.3 的 Samsung Galaxy-SII 上测试了这些应用程序,但我希望在运行 Android 2.2 及更高版本的其他设备上运行它们不会有任何问题。

展望未来

我开始写这篇文章的目的是为了在 Android 平台上进行一些有趣的编程,我希望到目前为止它一直是这样的。如果您有兴趣进一步研究 App Inventor,除了将项目扩展到更有趣和有用的东西之外,您可能需要查看的第一件事是各种其他组件。特别值得注意的是数据存储组件(允许您在设备上存储数据)、用于与远程 Web 内容交互的 Web 组件、其他传感器组件和媒体组件。

App Inventor 很有趣,但您可能会觉得,虽然它是一个很好的起点,但随着您越来越熟悉 Android 开发,您会更喜欢更传统的编程语言。与其完全丢弃您的 App Inventor 项目,不如考虑使用 App Inventor Java Bridge,以便在使用更传统的 Java 编程方式编写 Android 应用程序时使用您的 App Inventor 组件。

如果您觉得需要运行自己的 App Inventor 服务,MIT 移动学习中心已提供 App Inventor JAR,使您能够托管自己的服务(请参阅资源)。

如果您想继续探索 App Inventor 本身,有两本优秀的图书可供选择:David Wolber、Hal Abelson、Ellen Spertus 和 Liz Looney 的《App Inventor: Create your own Android apps》(O'Reilly 出版)和 Jason Tyler 的《App Inventor for Android: Build Your Own Apps—No Experience Required!》(Wiley 出版)。

如果您喜欢 App Inventor,您可能想看看其他一些用于可视化编程 Android 设备的工具,例如 DroidDraw 和 Corona。如果您想在设备本身上可视化编程 Android,请查看 Catroid。

资源

MIT App Inventor: http://appinventor.mit.edu

设置您的计算机: http://appinventor.mit.edu/learn/setup/index.html

App Inventor 参考: http://appinventor.mit.edu/learn/reference/index.html

APK 文件格式: http://en.wikipedia.org/wiki/APK_%28file_format%29

App Inventor 内幕: http://googleresearch.blogspot.com/2009/08/under-hood-of-app-inventor-for-android.html

App Inventor 开源项目: http://code.google.com/p/app-inventor-releases

Activity Starter 组件: http://appinventor.mit.edu/learn/reference/other/activitystarter.html

App Inventor Java Bridge 项目: http://groups.google.com/group/app-inventor-instructors/browse_thread/thread/10a64e64b7886afb

运行您自己的 App Inventor 服务: http://appinventoredu.mit.edu/developers-blogs/andrew/2011/nov/running-your-own-app-inventor-service

App Inventor 课程: http://sites.google.com/site/appinventorcourse

Peter McNeil 的“Android App 开发”演示文稿: http://www.cjugaustralia.org/September+2011

Catroid 项目: http://code.google.com/p/catroid

本文代码(在 appinventor_article 子目录中可用): https://bitbucket.org/amitksaha/articles_code/src

加载 Disqus 评论