搜档网
当前位置:搜档网 › 基于Android的应用软件开发实例初探

基于Android的应用软件开发实例初探

基于Android的应用软件开发实例初探
基于Android的应用软件开发实例初探

基于Android的应用软件开发实例初探

指导教师:xxxxxx

项目作者:xxxxxx

2010 年 3 月 15日

目录

1.引言 (3)

2.Android应用软件开发基础 (3)

2.1 Android应用软件开发的语言 (3)

2.1.1 Simple (3)

2.1.2 Scala (3)

2.1.3 Java (3)

2.2搭建开发环境 (4)

2.2.1 计算机配置 (4)

2.2.2 下载SDK初始包 (4)

2.2.3 安装ADT (4)

2.2.4 设置Eclipse (4)

2.3 ADT的使用 (5)

2.3.1 创建一个Android项目 (5)

2.3.2 编译运行一个项目 (5)

2.4 Android平台应用程序基础 (6)

2.4.1概要 (6)

2.4.2 Android应用程序组件 (7)

2.4.3 AndroidManifest.xml 文件 (8)

3.音乐播放器实例 (8)

3.1创建项目 (9)

3.2 设计界面 (10)

3.2.1准备图片 (10)

3.2.2准备字符串资源 (11)

3.2.3 设计程序的窗口布局 (12)

3.3编写Java代码 (13)

3.4 运行、调试程序 (16)

3.5打包发布程序 (17)

4.参考资料 (17)

5.附录 (18)

5.1 song_item.xml的代码 (18)

5.2 songlist.xml的代码 (18)

5.3 strings.xml文件代码 (19)

5.4 AndroidManifest.xml文件代码 (19)

5.5 MusicPlayer.java的代码 (19)

1.引言

Android系统是由Google在2007年发布的一个开源平台,包括操作系统、中间件,以及一些关键应用。由于Android系统有开源、免费、易于移植的特点,以及Google等厂商的大力支持,Android 在短短几年时间内得到了飞速发展。2008年HTC推出第一款Android系统机型Dream G1之后,各厂商都纷纷跟进,推广速度十分喜人。另外还有一些厂家利用Android易于移植的特性,开发了或正在开发基于Android系统的电子书阅读器、平板电脑、MP4、MID等智能终端。可以预见,Android 的应用范围将越来越广,学习Android的开发也一定会有越来越大的用武之地。

在该课程设计中,我通过学习Android的API,开发了一个简易的音乐播放器,实现了最基本的功能。通过这一实例,我们也能从中一窥Android应用的开发流程。

2.Android应用软件开发基础

2.1 Android应用软件开发的语言

2.1.1 Simple

Simple是Google于2009年7月推出的一种新的语言,其目的就是简化Android开发的难度,提供一种类似于Visual Basic的编程体验,在设计时就为Android的开发作了许多考虑。它的平台是完全开源的,但是目前Simple的资料较为贫乏,不便于学习。

2.1.2 Scala

Scala是一种特色鲜明的语言,它和Java一样运行于JVM之上,但是却同Java有许多设计理念上的区别。它提供一种类似函数式编程的方式,同时也提供了对面向对象的支持,这也是一种新生的语言,应用范围正变得越来越广,在编写运行于多核处理器的程序时具有一定优势。

之所以可以用Scala编写Android的应用程序,根本原因是Scala和Java编写的程序一样运行于JVM上。但是光这一点还不够,编写Scala程序所用到的Scala库得作一些改动,已经有人将可用于Android开发的Scala库制作好了,开发人员可以直接使用修改后的Scala库代替原先的Scala 标准库。我们用Scala编写的程序,实际上是先被Scala的编译器编译成了Java的class文件,然后再由Android dex编译器将Java class文件编译成Android设备里的JVM中可以运行的dex文件。

2.1.3 Java

Java是Android上的主流开发语言,各种支持也最完善。Android发布的API和SDK也都主要是面向Java开发人员的。我们的播放器实例也是用Java开发的。

2.2搭建开发环境

2.2.1 计算机配置

开发Android应用所用到的开发工具较占内存,尤其是模拟器。官方并未给出最低配置要求,根据个人实际体会,在本人Intel T2080双核及1G内存的情况,基本上能流畅使用。另外还需有600MB 以上的剩余磁盘空间(官方文档中的说明)。

2.2.2 下载SDK初始包

初始包中有开发Android程序所要用到的工具,这些工具包括了从编译到运行Android应用程序所需要的各种工具。因此,事实上最基本的开发环境至此就已经搭建完整。(SDK的下载地址为https://www.sodocs.net/doc/1813046567.html,/sdk/index.html,本来官方网站为https://www.sodocs.net/doc/1813046567.html,,但是经常被封锁,该链接更为稳定。)

2.2.3 安装ADT

按照2.2.2安装完SDK初始包后,就可以开始开发Android应用程序了,但是为了更高效地进行开发,Android团队推出了Android Development Tools (ADT)。ADT是目前开发Android应用最有效的工具,它是一个Eclipse插件,支持Eclipse 3.4及3.4以上的版本。以Eclipse 3.5 (Galileo)为例,安装过程如下:

1.打开Eclipse,选择Help > Install New Softare。

2.在Available Software对话框中,点击Add...。

3.在弹出的Add Site对话框中,任意填写一个名字到Name一栏。在Location一栏,则填入这一URL:“https://https://www.sodocs.net/doc/1813046567.html,/android/eclipse/”,然后确认返回。(注意:如果在后续的步骤中发现无法安装插件,可以试着把URL中的https换成http。)

4.返回到Available Software窗口后,就能看到列表中出现了"Developer Tools",选中它前面的复选框,再点击“Next”,就会开始下载安装ADT的各种组件了。

5.安装完毕后将弹出窗口显示ADT相关的各种信息以及许可协议,点击“Finish“即可完成安装。

6.重新启动Eclipse。

2.2.4 设置Eclipse

1.选择"Window > Preferences... "打开偏好设置

2.从左侧边栏中选择"Android"一栏。

3.单击SDK Location一栏边的Browse按钮,选择刚刚下载的SDK保存的路径。

4.点击Apply,OK,设置生效。

至此,Android的开发环境就已经搭建完毕,可以使用了。

2.3 ADT的使用

2.3.1 创建一个Android项目

1.选择File > New > Project

2.点击Android > Android Project ,然后点击Next

3.在弹出的对话框内,依照提示,输入必要的内容:

1) 输入Project Name,整个项目的代码将自动保存在以名字命名的文件夹下。

2) 在Contents选项中,选定Create new project in workspace 以及项目保存的位置。

3) 在Target选项中,从列出的Android目标平台中选择一个或多个。编译时将会编译成所选目标平台上的程序。

4) 在Properties选项中,填写必要的内容:

a)在Application name 处输入应用的名称。该名称将会作为标题显示在手机中。

b)在Package name 处输入包的名称

c)选择是否需要创建一个Activity(关于Activity的概念将在后面的章节中讲述)。大多数

应用程序都需要有至少一个Activity。如果选择了创建,那么就还需要填写主Activity的名

称。

d) 输入Min SDK Version ,ADT会把该设置写入Manifest.xml文件中(下文将介绍该文

件的作用)。这一选项是用于判断该应用程序是否能兼容于某版本的Android系统。由于推

出时间不久,Android的更新速度十分快,现已发布了1.0,1.1, 1.5, 1.6, 2.0, 2.0.1, 2.1这

几个版本。市面上现有的大部分Android终端都是基于1.5(API Level 为3)以后的版本,

少数最新款的设备使用了2.0以后的版本。因此,如果没有使用特殊的API,我们把此处设

为3即可保证良好的兼容性。

4.点击Finish,完成设置。

创建完成后,我们即可在方才设置的工作目录中找到项目文件。ADT会为我们创建以下目录及文件:

src/该目录下保存我们所编写的Java代码文件。

/该目录下是我们所设置的目标Android版本所对应的android.jar gen/该目录下保存的是由ADT根据我们的界面设置、资源设置等自动生成的代码assets/初始为空,可以用来存放assets文件

res/保存程序要用到的资源,如窗口布局、字符串值等

AndroidManifest.xml用于描述应用程序的文件,Android会读取该文件,用以确定应用程序所需要的权限等信息。

default.properties用于保存该项目的信息,比如各项设置,该文件也由ADT管理,不需要手动编辑。

2.3.2 编译运行一个项目

为了节省时间,我们大多数的测试都是在模拟器上运行,最后才在真实的硬件上运行程序。Android的SDK中提供有模拟器程序,要让模拟器运行起来,我们则还需要创建称为AVD(Android Vitual Device)的配置文件。SDK中的命令行工具可以用来创建AVD,安装ADT之后我们也可以更直观地用图形界面创建。

1.创建AVD

1) 选择Window > Android SDK and AVD Manager,打开AVD管理器

2) 在弹出的窗口中会列出已经创建的AVD,我们点击创建一个新的AVD

3) 填写所需的选项。包括AVD名称,是否需要SD,虚拟屏幕的分辨率等。

4) 单击Create AVD ,创建完毕。

5) 运行程序

运行(或调试程序)可以通过点击主菜单上的Run > Run (或Run > Debug) ,ADT会为我们启动模拟器,并在模拟器中运行或调试我们的程序。在这个过程中,实际上Eclipse为我们完成了以下工作:

1) 如果项目中的文件有改动,就重新编译一次。

2) 如果没有设置启动选项,就创建之。

3) 如果模拟器还没有启动,就运行模拟器。

4) 通过Socket向模拟器发送编译过后的程序。

5) 向模拟器发送命令安装并启动该应用。

6) 如果是以调试方式运行,则应用程序启动后会等待调试器挂接,同时Eclipse

会切换到调试视图。

2.配置运行选项

在编写应用程序的过程中,我们有时候需要调整运行设置,比如运行不同的AVD,启动应用程序的某个特定Activity。这时,我们可以按以下步骤设置:

1) 打开Run > Open Run Dialog ,弹出设置窗口

2) 展开Android Application 节点,点击项目名称,右侧即会显示出相应的配置选

项卡。

3) 在Android, Target,Common三个选项卡中,根据需要,修改设置。

4) 点击Run,即会根据新的设置运行。

3.为应用程序签名

出于安全的考虑,所有的Android应用程序都必须有数字签名,Android系统才会允许安装该程序。在开发程序时,我们可以使用调试密钥(debug key),带有这种密钥的应用程序可以在模拟器或是在我们开发用的设备上安装。如果要正式发布应用程序,则还需要取得正式的私钥。在实例开发一节中,讲详细介绍如何为应用程序打上数字签名。

2.4 Android平台应用程序基础

2.4.1概要

Android 应用程序编写完成后,都是由aapt工具(ADT 会自动调用该工具)打包成apk文件,一个apk文件就是一个完整的应用程序,它包含了编译好了的程序以及各种资源、描述性文件(如Manifest.xml)。在运行时,每个Android应用程序具有如下特点:

1.默认情况下,每个应用程序都运行在一个Linux进程中。当应用程序中的某部分代码

需要得到执行时,Android会为这个应用程序启动一个进程,该进程会一直存在,直到代码中要求退出,或者系统资源不足时Android将其杀死。

2.每个进程都运行于一个相互独立的JVM。

3.默认情况下,每个应用程序都会被赋予一个唯一的Linux user ID。结合Linux的权

限设置,就可以保证只有该应用程序可以访问属于它的文件。

4.某些特殊情况下,我们可以让两个应用程序共用一个Linux user ID,这时,应用程序

的文件相互之间都是可以访问的。为了节约系统资源,Android会自动把这两个应用程序合并到一个进程中,共享一个JVM。

2.4.2 Android应用程序组件

Android应用程序最大的一个特点就是每个应用都由若干组件构成。而且各个应用程序的组件还可以相互调用(需要在代码中设置相应权限)。例如假设我们需要编写一个内嵌有网页的程序,那么我们无需亲自编写浏览器,而是可以直接调用系统自带的Chrome Lite浏览器组件。又如假设我们编写了两个应用程序,其中一个程序中有列表显示图片的组件,那么我们在另外一个应用程序中就可以使用该组件,而不需要再编写该功能。也就是说,不同于我们平常编写的程序,Android的应用程序不是单一入口,而是可以从代码的不同位置启动。这就要依靠组件来实现。

Android应用程序的组件有以下四种:

1.Activities

一个activity实际上表现出来的就是一个程序的界面。这个界面可能有许多种不同的形式,比如有列表形式,有文字形式,有图像格子等形式。一个应用程序也可能有不止一个activity。比如一个短消息的程序,需要有列表显示所有消息的activity,还至少需要一个编辑短消息的activity(界面),还可能需要设置、菜单等界面。

每个activity都有一个默认的窗口用于绘制界面,一般情况下,它是充满全屏的,但是我们可以通过程序控制它,使其小于屏幕大小,也可以控制其浮动于其它窗口之上(如Android中的Toast信息),

Activity中显示出来的内容其实是由view堆叠形成的,view是由View基类派生出来的各种形式的界面元素,如ListView,GridView等等,通过组合这些view,就形成了一个可见的activity。我们可以用Activity.setContentView()方法来设置一个activity中所要显示的view。

2.Services

service是一种没有界面的组件,同我们平常在Windows或Linux系统中所理解的“服务”一样,Android上的service也是运行在后台的,运行时间可以从系统启动到系统关闭为止。对于许多应用程序来说,service组件是至关重要的。以下载管理器为例,用户肯定希望能够在切换到其它程序时仍然在后台进行下载,这就需要用到service完成下载工作。而显示下载进度、已下载文件等信息则由activity完成,同时我们还希望能控制下载过程,如停止、继续等,这就需要activity与service之间进行通信。Android允许activity连接到或者绑定到service上,这样就可以让用户在界面上控制后台service的行为。

3.Broadcast receivers

Broadcast意为广播消息,Android系统自身会发出许多广播消息,如电量不足,用户修改了全局设置等,各个应用程序也以向整个系统广播消息,如文件下载完毕等。

Broadcast receiver则是程序中专门用来接收广播消息的组件,它没有界面显示,只负责监听、接收广播消息,然后根据程序逻辑,启动其它组件去处理广播消息。它可以启动一个activity来同用户交互,也可以使用NotificationManager向用户发出通知。NitificationManager的通知形式有许多种,比如说振动、响铃、闪LED灯,还可以在Android 界面的消息栏处显示信息。

4.Content providers

content provider是一种为其它应用程序提供数据的组件。这些数据可以保存在文件中,也可以保存在SQLite数据库中,还可以以其它任何有效的方式保存。ContentProvider类为

我们提供了一系列保存数据的方法供我们调用,可以很方便地存储数据。其它应用程序在需要使用这些数据时,可以用ContentResolver对象,使用其中的方法。ContentResolver可以与任何content provider交互,获取其中的数据。

只要需要某个组件,Android就会尽力保证它的可用:如果该组件还没启动,就启动它,如果该组件所属的应用程序还没拥有一个进程,则为它启动一个进程,如果系统资源不足以容纳一个新的进程,则将后台的某个进程杀死为新进程腾出资源。

2.4.3 AndroidManifest.xml 文件

在Android启动某个程序之前,它得事先知道程序中有哪些组件。因此,apk文件中需要有一些描述信息,告知Android系统,这个任务就由AndroidManifest.xml文件完成。AndroidManifest.xml文件是一个结构化的XML文件,它除了包含有各个组件的信息,还包括许多其它的信息,如声明该程序所需要用到的库、声明所需要的权限等。它的基本样式如下所示:

android:icon="@drawable/small_pic.png"

android:label="@string/freneticLabel"

. . . >

. . .

不难看出,name,icon,lable这些属性就分别指activity的名称、图标、标识。我们通过manifest 描述程序的信息,Android系统就能读取出来并产生相应的行为。

3.音乐播放器实例

为了更好地体会Android应用程序的开发,我们将编写一个简易的音乐播放器为例,逐步分析如何编写一个Android程序。

下图就是播放器在模拟器中运行的截图。它具有基本的播放功能,能自动扫描SD卡中的Music 目录,并列出该目录下的所有mp3文件。点击列表中的歌曲名称即可播放,通过上方的按钮可以控制暂停、继续、上一曲、下一曲。

3.1创建项目

1.点击File->New ->Project,选择Android Project,再点击Next,即弹出项目属性窗口。

2.填写项目名称。在Contents选项中,我们按如图所示选择。保存的位置可以根据需要选择"Use

default location"或是另外选择。

3.在Build Target选项中,我们从已经安装的平台中选择一个,我们选择1.5版。

4.在Properties选项中,我们按如下所示填写:

5.填写完毕后,点击"Finish",项目即创建好了。

6.在Eclipse的左侧栏中,我们可以看到项目的结构:

顾名思义,src目录就是我们将要编写的java代码文件。另外

需要我们注意的就是res这个目录。它下面的drawable目录

保存的是我们要用到的图片。layout目录保存的是描述窗口布

局的XML文件。values文件则保存的是包含有字符串值信息

的XML文件。

3.2 设计界面

该播放器程序的主界面并不复杂,它由两部分组成,上半部分是一排按钮,下半部分是一个列表。下面我们逐步分析如何绘制界面。

3.2.1准备图片

该程序共用需要以下7个图标,全部为png格式。把这些图标放在项目的res/drawable目录下。

3.2.2准备字符串资源

除了图片资源,在程序中,我们还需要用到一些字符串资源。之所以不将字符串直接写入java 代码中,是因为那样在项目规模大了以后不便于管理,也不便于实现多语言等功能。利用ADT,我们可以很方便地添加字符串资源。步骤如下:

1.展开左侧栏中的res/values目录,双击打开values目录下的strings.xml文件。

2.在编辑窗口中,我们可以看到ADT已经为我们自动添加了名为hello和app_name的两个String 类型的资源。下面我们将添加另外一个字符串,当歌曲列表中没有曲目时,就将显示该字符串。首先,点击Add...,在弹出的窗口中,选择String,然后点击OK。然后在Name和Value处填入字符串的名称和字符串的内容。保存之后,就可以在其它地方引用该资源。

3.2.3 设计程序的窗口布局

窗口布局文件位于res/layout目录下,我们将在layout目录下创建我们的布局文件。

1.在左侧栏中的layout文件夹上右键,选择New->File,在弹出的窗口中的File name处填入songlist.xml。单击Finish,即创建了一个空的布局文件。如果对Android布局XML文件的语法非常熟悉,那么可以直接编辑该文件,但是一般情况下,我们还是用ADT工具进行所见即所得的编辑。2.Android的窗口是由Layout和View组成的,Layout中可以包含View和Layout。我们这个应用的界面排列较简单,因此,最外层的Layout可以采用LinerLayout这种比较简单的格式。要添加它,先点击右侧边栏中Outline选项卡下的绿色“+”按钮,在弹出的窗口中选择LinerLayout,就添加成功了,在Outline窗口中就可以看到刚刚添加的这一项,同时中间的主窗口中也会显示一个空的黑色窗体。另外,我们还可以修改某个Layout或View的属性,方法是在右侧的Outline窗口中选中要修改的窗口元素,在下侧边栏中,切换到Properties选项卡,就可以看到所有的项目属性。

大多数的选项都不需要我们手动设置。下面我们继续添加其它的窗口元素。Layout下可以嵌套其它的Layout和View,界面的上部分就是在最外层的LinerLayout下再放置了一个LinerLayout,然后在里层的LinerLayout里放置一排ImageButton。界面的下半部分是一个ListView(或者TextView)。当要在某个Layout里添加元素时,只需要先点击选中该Layout然后再点击"+"图标,就可以添加子元素到其中。最后布局层次如图所示:

这时我们还需要对各个元素的属性作一些修改。例如

对于5个ImageButton,我们需要设置其Src属性。

这个属性表示的是图片的来源。例如back按钮上要

显示是的一个指向左边的箭头,这个箭头图标名为

back.png,在前述步骤中已经被放在了res/drawable

目录中了。我们要把这个图标设为back按钮的图片

来源,就需要在Src属性处填入"@drawable/back"。

"@drawable/back"就是引用这个箭头图标资源的ID。

如左图所示,在第一个LinerLayout下面,我们还添

加了一个View。这个View中没有显示元素,而只是

起一个分隔线的作用,让界面更美观一些。我们把这

个View的Layout height 属性设为5dip,在显示时,

上方的按钮就不会和下方的歌曲列表挤在一起了。

在空白View的下方,可以看到,我们分别添加

了一个ListView和一个TextView。值得注意的是,这

两个元素其实并不会同时显示。这是因为它们的Id分

别为"@android:id/list"和"@android:id/empty",这种Id 属于Android系统的特殊Id,分别表示列表时要显示的和列表中无条目时要显示的元素。这样的话就

不需要我们再编写代码来根据列表是否为空来显示相应元素了。

最后,我们还可以根据需要,把元素的Id改成便于记忆的名称这样在使用时就更容易记忆。完成所有这些工作后,在Eclipse的主窗口中,就可以看到程序界面的预览效果。

3.3编写Java代码

设计好了界面之后,下一步就是编写程序的Java代码了。由于该程序较为简单,只有MusicPlayer.java一个代码文件。其中的MusicPlayer类完成了绝大部分的操作。

1.MusicPlayer的成员变量。

其中:MEDIA_PATH是扫描音乐文件的起始目录;songs是用于保存歌曲路径的数组;mp是一个MediaPlayer的对象,我们通过这个对象控制音乐的播放、暂停等操作;currentPosition是当前播放的歌曲在列表中的序号,列表中的每一项都依次有一个序号,我们根据这个序号来判断上一曲和下一曲;status是指当前播放的状态,值为0表示停止播放,为1表示正在播放,为2表示被暂停播放。除此之后,4个Imageutton对象和1个ListView对象也分别有相应的成员变量。

2.编写onCreate()函数

onCreeate函数是会在MusicPlayer程序启动时得到调用的一个函数。因此需要在这里完成各种初始化的工作。首先要做的是调用全局的onCreate函数,这样才能确保一些更基本的初始化工作在我们的初始化工作之前完成。然后就是使用setContentView函数设置界面布局,可以看到,我们传递给该函数的参数是https://www.sodocs.net/doc/1813046567.html,yout.songlist,这就是在代码中引用布局文件的方式,其中R是一个全局的

对象,包含了所有的资源(如图片、布局等)。绘完窗口之后,我们调用一个成员方法updateSongList 来更新歌曲列表。

另外我们要在初始时做的就是设置事件监听函数。我们要监听对控制按钮的点击,还有对歌曲列表中各项的点击。给这些元素绑定事件监听函数就在这里完成。以Play按钮为例:

playButton变量是一个ImageButton对象,setOnClickListener方法用于为这个对象添加一个监听函数。它的参数是一个onClickListener(),作用是监听单击事件。在OnClickListerner中我们编写了onClick函数,根据当前的状态,判断点击Play按钮之后应该进行什么操作。除了Play按钮之外,还有stop按钮,以及上一曲、下一曲按钮。为它们添加事件监听函数的方式大同小异。稍有不同的是about按钮,点击它之后并不会影响播放,而是在程序窗口的上层浮动显示出提示信息。

如代码中所示,显示这种浮动信息所用的是Toast类,Toast.makeText方法可以构造一条这样的提示信息。setGravity方法是用于设置浮动信息在界面中的显示位置,最后调用show方法就可以把信息显示出来。

3.编写播放控制函数

播放控制函数一共有playSong, stopSong, preSong, nextSong, pauseSong, continueSong这6个,我们以playSong为例:

首先,我们要把当前状态设为1(即播放状态),然后,要用setImageResource函数把按钮的图标换成暂停图标,setBackgroundColor把将要播放的歌曲所在条目的背景换成灰色,这样就能知道当前正处于播放状态,以及播放的是哪个曲目了。

随后要做的就是MediaPlayer对象的初始化。由于初始化可能由于种种原因不能成功(如文件无法读取等),需要把它放在try块里,并记录可能出现的异常。

MediaPlayer对象在使用前要注意reset,因为它会保存上次的播放状态。reset之后,就可以用setDaataSource来设置多媒体文件的路径了。这个路径既可以是本地的,也可以是远程的。比如我们把一个http协议下的音乐链接传递给MediaPlayer对象,它能自动下载、缓冲、播放远程的文件,在本例中,我们只需要用到播放本地文件的功能。

Prepare方法则是用于异步地准备播放的数据。比如在播放远程文件时,使用该方法就会从远程获取数据而不阻塞其它动作。作好这些准备后,就可以调用start方法,如果之前的状态是暂停播放,start方法就会继续播放(除非调用了reset方法),否则,它就会从头开始播放音频文件。

为了解决自动连续播放的问题,我们还要监听播放完毕这个事件,就是通过setOnCompletionListener方法设置一个监听器,监听到播放完成后就切换到下一曲继续播放。另外几个控制播放的方法也基本上都是对MediaPlayer对象的控制。在此不在赘述,详细代码请参见附录。

4.生成文件列表

在onCreate方法中,我们调用了updateSongList方法,它的代码如下:

在这个函数中,先是遍历MEDIA_PATH下的所有MP3文件(通过Mp3Filter过滤器实现,Mp3Filter类的代码参见附录),把所有文件的路径保存到songs数组中。然后就是设置一个Adapter,设置列表为空时就显示song_item这个布局文件,而不是正常情况下的曲目列表。

3.4 运行、调试程序

要运行或调试项目,可以使用快捷键Ctrl+F11(运行)或F11(调试)。如果没有事先启动模拟器,则会在这时候启动模拟器,模拟器启动之后,Eclipse会把编译好的apk文件上传并安装到模拟器中,同时发送信号启动该程序。在Eclipse的Console窗口中,我们可以看到以下信息:

这些信息清楚地显示了每一步的操作。另外,如果是要调试程序的话,程序启动之后还会等待连接Eclipse上的调试器,同时Eclipse会切换到调试视图。在该视图中我们可以使用单步跟踪等各种调试功能。

3.5打包发布程序

使用ADT工具,我们可以很方便地程序进行打包操作,并打上自己的签名。

1.点击File->Export。

2.在弹出的窗口中选择"Export Android

Application",点击"Next"。

3.接着会弹出窗口要求选择一个项目,我们

选择MusicPlayer这个项目,然后再点击

"Next"。

4.第一次进行此操作时,会要求创建

keystore,因此,要在此处输入想要设置的

密码,并重新输入一次核对(如果不是第一

次,则在此处输入设置的密码)。另外还可

以选择keystore的位置,一般保持默认即

可。完成后点击"Next"。

5.如果是第一次来到这步操作,则会要求填

写信息创建密钥。按要求填写完各项即可。

若不是第一次来到此步,则只需要选用一个

已经存在的keystore并输入这个keystore

的密码。然后再点击"Next"。

6.如果密码正确,则会要求选择所生成的

APK文件的位置。选择完毕后点击"Finish",

我们即可在刚才选择的位置处找到APK文

件,把它传至Android终端里,即可安装运

行。在我的Android手机上,MusicPlayer

的运行效果如图所示。

至此,我们的项目实例就完成了,如果

觉得所开发的应用有实用价值,我们还可以申请一个Android App Market的帐户,把自己的应用程序上传到App Market中,这样就可以与全球的Android用户分享自己的作品了。

4.参考资料

[1] Android开发者网站:https://www.sodocs.net/doc/1813046567.html,

[2] Android中文网:https://www.sodocs.net/doc/1813046567.html,

[3] CSDN: https://www.sodocs.net/doc/1813046567.html,

5.附录

5.1 song_item.xml的代码

xmlns:android="https://www.sodocs.net/doc/1813046567.html,/apk/res/android"

android:layout_width="wrap_content"android:layout_height="wrap_content"

android:paddingLeft="10dip"/>、

5.2 songlist.xml的代码

android:orientation="vertical"android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:layout_width="wrap_content"android:layout_height="wrap_content">

android:layout_height="wrap_content"android:id="@+id/back"

android:src="@drawable/back">

android:layout_height="wrap_content"android:id="@+id/stop"

android:src="@drawable/stop">

android:layout_height="wrap_content"

android:src="@drawable/play">

android:layout_height="wrap_content"android:id="@+id/forward"

android:src="@drawable/forward">

android:layout_height="wrap_content"android:id="@+id/about"

android:background="@drawable/about"

android:layout_gravity="bottom">

android:layout_height="5dip">

android:layout_height="fill_parent"android:layout_weight="1"

android:drawSelectorOnTop="false"

android:scrollbarAlwaysDrawVerticalTrack="true">

android:layout_height="fill_parent"android:text="@string/no_song"/>

5.3 strings.xml文件代码

Hello World, MusicPlayer!

尚未选择曲目

5.4 AndroidManifest.xml文件代码

package="com.xubin.android"

android:versionCode="1"

android:versionName="1.0">

android:label="@string/app_name">

5.5 MusicPlayer.java的代码

package com.xubin.android;

import java.io.File;

import java.io.FilenameFilter;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import android.app.ListActivity;

import android.content.Context;

import android.graphics.Color;

import android.media.MediaPlayer;

import android.media.MediaPlayer.OnCompletionListener;

import android.os.Bundle;

import android.util.Log;

import android.view.Gravity;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ArrayAdapter;

import android.widget.ImageButton;

import android.widget.ListView;

import android.widget.Toast;

class Mp3Filter implements FilenameFilter {

public boolean accept(File dir, String name) {

return (name.endsWith(".mp3"));

}

}

public class MusicPlayer extends ListActivity {

private static final String MEDIA_PATH = new String("/sdcard/Music");

private List songs = new ArrayList();

private MediaPlayer mp = new MediaPlayer();

private int currentPosition = 0; // 当前播放的歌曲序号private int status = 0; // 播放状态

private ImageButton stopButton;

private ImageButton playButton;

private ImageButton backwardButton;

private ImageButton forwardButton;

private ImageButton aboutButton;

private ListView lv;

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(https://www.sodocs.net/doc/1813046567.html,yout.songlist);

updateSongList();

lv = this.getListView();

相关主题