《Android应用开发》
实验指导书
桂林电子科技大学计算机科学与工程学院
2013.9
第 1 页
目录
实验一:搭建Android平台和创建HelloWorld ........................... 1
一、实验目的......................................................................................................... . 二、实验要求......................................................................................................... . 三、实验内容......................................................................................................... .
1、安装并配置Java JDK ................................................................................ . 2、安装MyEclipse或Eclipse ........................................................................ . 3、安装Android SDK ..................................................................................... . 4、安装ADT(Android Development Tools) .............................................. . 5、创建Android虚拟设备(AVD) ............................................................. . 6、建立新项目HelloWorld ........................................................................... .
实验二:UI设计 ..................................................... 8
一、实验目的......................................................................................................... . 二、实验要求......................................................................................................... . 三、实验内容......................................................................................................... .
1、常用控件 .................................................................................................. . 2、界面布局 .................................................................................................. . 3、事情处理 .................................................................................................. .
实验三:Intent、Activity应用 ...................................... 16
一、实验目的......................................................................................................... . 二、实验要求......................................................................................................... . 三、实验步骤......................................................................................................... .
1、创建项目................................................................................................... . 2、添加布局文件........................................................................................... . 3、创建Activity ............................................................................................ . 4.修改AndroidManifest.xml文件 .............................................................. .
实验四:service应用 ............................................... 22
一、实验目的......................................................................................................... . 二、实验要求......................................................................................................... . 三、实验步骤......................................................................................................... .
1、创建项目................................................................................................... . 2、布局文件................................................................................................... . 3、修改AndroidManifest.xml文件 .............................................................. .
实验五:SQLite和SQLiteDatabase应用 ............................... 27
一、实验目的......................................................................................................... . 二、实验要求......................................................................................................... .
1、创建项目................................................................................................... . 2、布局文件................................................................................................... . 3、创建Activity ............................................................................................ .
实验六:图形绘制与OpenGL ES ....................................... 38
一、实验目的......................................................................................................... . 二、实验要求......................................................................................................... .
第 2 页
三、实验过程......................................................................................................... .
1、绘制直线、园、曲线等各种图形 .......................................................... . 2、显示字符 .................................................................................................. . 3、利用OpenGL ES方法编程 ...................................................................... .
实验七:网络访问与服务 ............................................ 45
一、实验目的......................................................................................................... . 二、实验要求......................................................................................................... . 三、实验内容......................................................................................................... .
1、访问WEB网站,通过HttpResponse类,读入网络数据 .......................... .
实验八:硬件访问与传感器 .......................................... 53
一、实验目的......................................................................................................... . 二、实验要求......................................................................................................... . 三、实验步骤......................................................................................................... .
1、了解程序使用手机电话功能的方法,实现短信收发........................... . 2、对手机上传感器进行编程,实现相机拍摄........................................... .
第 3 页
实验一:搭建Android平台和创建
HelloWorld
实验目的
本次实验的目的是让大家熟悉搭建智能手机开发平台的过程,了解Andorid开发项目的基本文件目录结构,并实现HelloWorld小例程。
实验要求
1. 完成Android开发平台的搭建及相关配置 2. 创建项目并熟悉文件目录结构 3. 实现例程HelloWorld
实验内容
一、安装并配置Java JDK
1. 下载安装JDK,如安装目录为:C:\\Program Files (x86)\\Java\\jdk1.6.0_18。 2. 配置JDK:
XP:右键“我的电脑”“属性”“高级”“环境变量” WIN7:右键“我的电脑”“高级系统设置”“环境变量” 新建系统变量:
JAVA_HOME,C:\\Program Files (x86)\\Java\\jdk1.6.0_18(JDK安装目录)。
PATH,%JAVA_HOME%\\bin;%JAVA_HOME%\\jr\\bin。 CLASSPATH,.;%JAVA_HOME%\\lib;%JAVA_HOME%\\lib\ools.jar(前面的.;一定要加上)
配置完成后在CMD中输入java –version和javac –version,能看到对应的JDK版本即配置成功,如下图所示。
第 - 1 - 页
二、安装MyEclipse或Eclipse
安装平台。
三、安装Android SDK
1. 下载Android SDK
地址:http://dl.google.com/android/android-sdk_r05-windows.zip。 注意SDK的版本为r05,对应的ADT版本应为10.0.0,SDK和ADT需要对应才能正常运行程序。 2. 安装SDK
安装过程可能碰到的问题1:弹出窗口“Failed to fetch url„” 需要如下设置:关闭该窗口点击“cancel”在左侧选择“Settings”选中“Force https://...” 点击“Save and Apply”重新运行安装文件。
安装过程可能碰到的问题2:弹出窗口“a folder failed to be renamed or moved”
需要如下设置:将文件夹“android-sdk-windows”下的“tools”复制粘贴。打开文件夹“tools-复制”运行“android.bat”再次运行安装文件。
进入安装过程后,选择“Accept All”,点击“Install”,如下图所示。
安装完成后可以看到如下图所示的列表。
第 - 2 - 页
3. 配置SDK
同配置JDK一样配置SDK,将SDK的根目录\ools(如:C:\\Users\\33\\Desktop\\android-sdk-windows\ools)加入到系统变量PATH中。配置完成后在CMD中运行android,能看到一系列信息并打开了SDK Manager即说明SDK配置成功,如下图所示。
四、安装ADT(Android Development Tools)
1. 下载ADT
地址:http://dl.google.com/android/ADT-10.0.0.zip。 2. 安装ADT
a) 解压下载的ADT包。
b) 打开MyEclipse或Eclipse。 c) 安装。
MyEclipse:点击“Help”“Software Updates”“Find and Install…”“Search for new features to install”点击“New Local Site”选择解压后的ADT包,然后按照提示安装即可。 Eclipse:“Help”“Insatll New Software…”“Add…”在Name中输入“ADT”,Location中选择解压的包,然后按照提示安装即可。
第 - 3 - 页
3. 配置ADT
在MyEclipse或Eclipse中:“Window”“Preferences”“Android”在“SDK Location”项选择SDK根目录。 配置过程可能出现的问题:“Can not find…/tools/adb.exe!”,这是因为tools目录下的adb.exe被移动到了platform-tools下了,从文件夹“platform-tools”中将adb.exe、AdbWinApi.dll和AdbWinUsbApi.dll三个文件拷贝至文件夹“tools”下即可。
五、创建Android虚拟设备(AVD)
1. 打开SDK Manager
2. 点击“Virtual Device” 3. 点击“New”
4. 如下图所示设置,Target选择Android2.2,Size是SD卡的大小(可自行调整)
5. 创建完AVD后选择该AVD并点击“Start”即可运行该AVD,AVD的启动过程很慢,耐心等待,运行成功如下图所示。
第 - 4 - 页
六、建立新项目HelloWorld
1. 打开MyEclipse或Eclipse。
2. 点击“File”“New” “Project”“Android Project”,创建HelloWorld项目,如下几个地方需要进行设置。 项目名:HelloWorld
设置属性:
勾选“Android 2.2”
第 - 5 - 页
3. 项目目录结构如下图所示,能看到已经建立好了Class:HelloWorld.java,接下来对其进行修改。
4. 按照下图修改HelloWorld.java的内容,大家自己敲一敲熟悉一下。
5. 选择项目HelloWorld并点击“Run As”“Open Run Dialog”,用之前创建的AVD运行项目,运行结果如下图所示,到此为止HelloWorld项目就实现了。
第 - 6 - 页
第 - 7 - 页
实验二:UI设计
实验目的
本次实验的目的是让大家熟悉Android开发中的UI设计,包括了解和熟悉常用控件的使用、界面布局和事件处理等内容。
实验要求
1. 熟悉和掌握界面控件设计 2. 了解Android界面布局 3. 掌握控件的事件处理
实验内容
一、常用控件
1.常用控件介绍
Android中有许多常用控件(简单分类): 文本框:TextView、EditText
按钮:Button、RadioButton、RadioGroup、CheckBox、ImageButton 列表:List、ExpandableListView、Spinner、AutoCompleteTextView、GridView、ImageView
进度条:ProgressBar、ProgressDialog、SeekBar、RatingBar 选择器:DatePicker、TimePicker 菜单:Menu、ContentMenu 对话框:Dialog、ProgressDialog
常用的控件有文本框、按钮和列表等。
2.控件的实现
在上一个实验中,我们用TextView实现了在界面显示一句“Hello The Android World!”。
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this);
第 8 页
}
textView.setText(\"Hello The Android World!\"); setContentView(textView);
现在我们来看一看.xml文件和编码的相互关系。 在HelloWorld.java中敲入如下代码: package tju.scs.android.test; import android.app.Activity; import android.os.Bundle; import android.widget.Button; import android.widget.TextView;
public class HelloWorld extends Activity {
/** Called when the activity is first created. */ @Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
TextView textView = (TextView)findViewById(R.id.textView01); Button button = (Button)findViewById(R.id.button01); } }
注意在上面并没有为textView和button设置文本内容等,另外textView的初始化代码为:
TextView textView = (TextView)findViewById(R.id.textView01);
此处初始化用到了id为textView01的TextView。 在项目目录中找到/res/layout/main.xml,如下:
3.控件的属性
可以直接在类中为控件设置属性,也可以在xml文件中设置属性。每个控件都有一系列的属性,例如id、size、text、color等等,大家可以找找API查看控件的属性。
二、界面布局
Android中有很多布局: FrameLayout:最简单的一个布局对象。它里面只显示一个显示对象。Android
屏幕元素中所有的显示对象都将会固定在屏幕的左上角,不能指定位置。但允许有多个显示对象,但后一个将会直接在前一个之上进行覆盖显示,把前一个部份或全部挡住(除非后一个是透明的)。
LinearLayout:以单一方向对其中的显示对象进行排列显示,如以垂直排列
显示,则布局管理器中将只有一列;如以水平排列显示,则布局管理器中将只有一行。同时,它还可以对个别的显示对象设置显示比例。
TableLayout:以拥有任意行列的表格对显示对象进行布局,每个显示对象
第 10 页
被分配到各自的单元格之中,但单元格的边框线不可见。
AbsoluteLayout:允许以坐标的方式,指定显示对象的具体位置,左上角的
坐标为(0, 0),向下及向右,坐标值变大。这种布局管理器由于显示对象的位置定死了,所以在不同的设备上,有可能会出现最终的显示效果不一致。 RelativeLayout:允许通过指定显示对象相对于其它显示对象或父级对象的
相对位置来布局。如一个按钮可以放于另一个按钮的右边,或者可以放在布局管理器的中央。
布局中可以放置控件,而每个布局又可以嵌套其他布局,这种思想和之前学习java的布局是一样的。 例如在main.xml中如下布局:
android:gravity=\"center_horizontal\" android:background=\"#aa0000\" android:layout_width=\"wrap_content\" android:layout_height=\"fill_parent\" android:layout_weight=\"1\"/> android:gravity=\"center_horizontal\" android:background=\"#00aa00\" android:layout_width=\"wrap_content\" android:layout_height=\"fill_parent\" android:layout_weight=\"1\"/> android:gravity=\"center_horizontal\" android:background=\"#0000aa\" android:layout_width=\"wrap_content\" android:layout_height=\"fill_parent\" android:layout_weight=\"1\"/> android:text=\"yellow\" android:gravity=\"center_horizontal\" android:background=\"#aaaa00\" android:layout_width=\"wrap_content\" android:layout_height=\"fill_parent\" android:layout_weight=\"1\"/>
在一个LinearLayout布局下嵌套了两个LinearLayout,出来的效果如下图所示:
第 12 页
其他布局请大家自行尝试。
三、事情处理
事件监听和时间处理的概念大家以前都学习过,android中主要有如下事件方法:
onClick(View v) 一个普通的点击按钮事件
boolean onKeyMultiple(int keyCode,int repeatCount,KeyEvent event)用于在多
个事件连续时发生,用于按键重复
boolean onKeyDown(int keyCode,KeyEvent event) 用于在按键进行按下时发
生
boolean onKeyUp(int keyCode,KeyEvent event) 用于在按键进行释放时发生 onTouchEvent(MotionEvent event)触摸屏事件,当在触摸屏上有动作时发生 boolean onKeyLongPress(int keyCode, KeyEvent event)当长时间按时发生
下面以点击一个Button为例子: package tju.scs.android.test;
第 13 页
import android.app.Activity; import android.os.Bundle; import android.view.View;
import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast;
public class HelloWorld extends Activity {
/** Called when the activity is first created. */ @Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
Button button = (Button)findViewById(R.id.button01); button.setOnClickListener(buttonListener); }
private OnClickListener buttonListener = new OnClickListener(){ public void onClick(View v) { Toast.makeText(v.getContext(), \"You have clicked a button!\",Toast.LENGTH_LONG).show(); } }; } 为button添加了一个监听buttonListener,对应的onClick方法则抛出了一则文本框提示用户,效果图如下所示:
第 14 页
其他事件处理请大家自行尝试。
第 15 页
实验三:Intent、Activity应用
一、实验目的
本次实验的目的是让大家熟悉Intent和Activity的使用。Intent的最常用的用途是绑定应用程序组件。Intent用来在应用程序Activity间启动、停止和传输。并实现添加用户名,密码小例程。
二、实验要求
4. 完成Android开发平台的搭建及相关配置 5. 创建项目并熟悉文件目录结构
6. 实现例程添加用户名,密码实验步骤
三、实验步骤
项目界面:添加用户名,密码,在另一页面显示用户名。
1、创建项目
新建一个Android工程命名为test1,目录结构如下图:
第 16 页
2、添加布局文件
修改main.xml布局文件(这里增加了两个TextView,两个EditView,一个按钮),如下图
第 17 页
新建test2.xml布局文件(这里增加了两个TextView),这个页面是用来显示添加的用户名,如下图:
3、创建Activity
修改test1.java,并且新建一个Activity,一个是test2.java。,代码分别如下: Test1.java
作用:获得页面输入的内容,存储并跳转到test2.xml。
第 18 页
第 19 页
Test2.java
作用:从Intent中获得需要显示name的值,并给TextView赋值。
第 20 页
4.修改AndroidManifest.xml文件
比较重要的一步啦,修改AndroidManifest.xml文件(将新增的Activity,test2) 注册一下,代码如下(第16行):
第 21 页
实验四:service应用
一、实验目的
本次实验的目的是让大家熟悉service的使用。一个使用Service的典型的
例子是,用户一边在手机做其他的事情,一边听手机上的音乐。其中,在后台播放音乐就可以使用Service来实现。并实现简单播放器的小例程。
二、实验要求
1. 创建项目并熟悉文件目录结构。 2. 实现例程简单播放器。
三、实验步骤
项目界面:
1、创建项目
新建一个Android工程命名为test1,目录结构如下图:
第 22 页
2、布局文件 修改main .Xml文件
第 23 页
修改MusciPlayer.java文件,新建MusicService.java文件,代码如下图: MusciPlayer.java文件
第 24 页
MusicService.java
第 25 页
3、修改AndroidManifest.xml文件
比较重要的一步啦,修改AndroidManifest.xml文件(将新增的service) 注册一下,代码如下(第16行):
第 26 页
实验五:SQLite和SQLiteDatabase应用
一、实验目的
1、本次实验的目的是让大家熟悉Android中对数据库进行操作的相关的接口、类等。SQLiteDatabase这个是在android中数据库操作使用最频繁的一个类。通过它可以实现数据库的创建或打开、创建表、插入数据、删除数据、查询数据、修改数据等操作。
2、实现添加用户名,爱好小例程。
二、实验要求
1、完成Android开发平台的搭建及相关配置 2、创建项目并熟悉文件目录结构
3、实现例程添加用户名,爱好实验步骤
三、实验步骤
项目界面:输入用户名,爱好添加到数据库,由数据库查询出来显示插入的列表。当单击列表时会弹出Alert询问是否删除,进行删除操作。
第 27 页
1、创建项目
新建一个Android工程命名为Database,目录结构如下图:
第 28 页
第 29 页
2、布局文件
修改main.xml布局文件,添加display.xml文件,用来显示列表。如下图 Main.Xml
Display.xml
第 30 页
3、创建Activity
修改DatabaseActivity.java文件,新建DBHelper.java文件和displayAvtivity.java,代码如下图:
DBHelper.java 操作数据库的工具类,该类继承SQLiteOpenHelper。
第 31 页
第 32 页
DatabaseActivity.java 获取页面输入的值,添加到数据库
第 33 页
displayAvtivity.java 显示列表,删除数据
第 34 页
第 35 页
实验六 图形绘制与OpenGL ES
【实验目的】
在屏幕绘制各种图形,了解OpenGL 【实验要求】
1、了解在屏幕绘图方法 2、了解OpenGL 【实验原理】
【实验过程】
1、绘制直线、园、曲线等各种图形 2、显示字符
3、利用OpenGL ES方法编程
Android中的图形系统采用Client/Server架构。Server (即SurfaceFlinger)主要由c++代码编写而成。Client端代码分为两部分,一部分是由Java提供的供应用使用的api,另一部分则是由c++写成的底层实现。
Android图形系统中通过surface为view创建一个Canvas对象,管理view在surface上的绘图操作。View及其子类(如TextView, Button)要画在surface上。
OpenGL ES (OpenGL for Embedded Systems) 是一个针对嵌入式应用的,免费的,支持全功能2D、3D的跨平台API(OpenGL® ES is a royalty-free, cross-platform API for full-function 2D and 3D graphics on embedded systems - including consoles, phones, appliances and vehicles)。目前主要由3个版本,1.0,1.1,2.0。
OpenGL ES 1.0 是以 OpenGL 1.3 规范为基础的,OpenGL ES 1.1 是以 OpenGL 1.5 规范为基础的,1.1完全兼容1.0。OpenGL ES 2.0 则是参照 OpenGL 2.0 规范定义的。简单的来说,OpenGL ES是OpenGL针对嵌入式应用的简化版,也就是android使用的标准。OpenGL ES 1.1强调api的硬件加速,OpenGL ES 2.0更强调3D能力。
OpenGL ES 1.1和OpenGL ES 2.0之间的关系并不是旧版本和新版本之间的差别,而是一个针对相对低端的应用,一个针对高级应用,OpenGL官方的roadmap也是将这两个版本并行发展的。2.X并不能百分百兼容1.X。
Android现在支持1.X和2.X。OpenGL ES是专为内嵌和移动设备设计的一个2D/3D轻量级图形库,它基于OpenGL API设计,是OpenGL三维图形API的子集。Android里有三个与OpenGL有关的包: android.opengl
javax.microedition.khronos.egl
javax.microedition.khronos.opengles public void onDrawFrame(GL10 gl) { //一般的opengl程序,首先要做的就是清屏 第 36 页
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | //紧接着设置模型视图矩阵 gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity();//清空矩阵 GLU.gluLookAt(gl, 0, 0, 3, 0, 0, 0, 0, 1, 0);//视点变换,将相机位GL10.GL_DEPTH_BUFFER_BIT); 置设置为(0, 0, 3),同时指向(0, 0, 0)点 //设置模型位置旋转及缩放信息 gl.glTranslatef(0.0f, 0.0f, -1.0f);//将模型位置设置为(0, 0, -1) float angle = 30.0f; gl.glRotatef(angle, 0, 1, 0);//绕模型自身Y轴旋转30度 gl.glRotatef(angle, 1, 0, 0);//绕模型自身X轴旋转30度 gl.glScalef(1.2f, 1.2f, 1.2f);//设置三方向的缩放系数 //设置颜色 gl.glColor4f(0.0f, 0.0f, 0.0f, 1.0f); //渲染立方体 mCube.draw(gl, gl.GL_TRIANGLES); //mCube.draw(gl, gl.GL_LINES); }
第 37 页
实验七 网络访问与服务
【实验目的】
掌握Android网络访问方法 【实验要求】
1、了解手机WEB网站访问编程 2、通过网络进行数据访问 3、了解数据库使用 【实验原理】
利用Android网络访问协议 【实验过程】
1、访问WEB网站,通过HttpResponse类,读入网络数据。 Android SDK 网络包: 包 android.net android.net.http android.net.wifi 描述 Android网络访问 socket。该包包括URI 类,不仅仅是传统的联网方面。 处理Android有关Http协议类。 在 Android 平台上管理有关 WiFi(802.11 无线 Ethernet)应用的类。 android.telephony.gsm 包含用于管理和发送 SMS(文本)消息的类。 读入WEB数据例程: HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(url); HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); //尝试读取entity的长度,返回-1表示长度未知 long length = entity.getContentLength(); InputStream is = entity.getContent(); String s = null; if (is != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[512]; int ch = -1; int count = 0; while ((ch = is.read(buf)) != -1) { } 第 38 页
baos.write(buf, 0, ch); count += ch; //如果长度已知,可以通过taskProgress()通知监听者任务执行的比例 if (length > 0) { } //为了更好的演示进度,让线程休眠100ms Thread.sleep(100); listener.taskProgress(this, count, length); } Log.e(\"HttpTask\", \"length=\" + baos.toByteArray().length); //返回内容 s = new String(baos.toByteArray()); return s; 读入www.google.com网站数据: 第 39 页
实验八 硬件访问与传感器
【实验目的】
通过底层API访问手机硬件及手机上的各种传感器 【实验要求】
1、获取手机上电话、短信等各种功能的编程 2、了解手机上各种传感器的功能与使用方法 【实验原理】
利用手机本身的功能与相关传感器的使用 【实验过程】
1、了解程序使用手机电话功能的方法 短信收发:
◆发送短信只需要几行代码,如下: SmsManager sms = SmsManager.getDefault(); PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent(), 0); sms.sendTextMessage(phoneNumber, null, MsgStr, pi, null); 其中参数phoneNumber和MsgStr均是String类型,表示接收方的电话号码和短信内容
◆接收短信主要是继承BroadcaseReceiver 类 ,覆盖onReceive 函数: package com.android.TinySMS; import android.app.Activity; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.gsm.SmsManager; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class TinySMS extends Activity { public static final String SMS_ACTION = \"com.android.TinySMS.RESULT\"; // private TextView message; private Button snd; private EditText tel; private EditText txt; private SentReceiver receiver = new SentReceiver(); private class SentReceiver extends BroadcastReceiver { 第 40 页
@Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(SMS_ACTION)) { int code = getResultCode(); //短消息发送成功 if(code == Activity.RESULT_OK) } } Toast.makeText(TinySMS.this, R.string.msg_sent, Toast.LENGTH_SHORT).show(); }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tel = (EditText) findViewById(R.id.EditText01); tel.setText(\"5554\"); //模拟器之间互发短信 txt = (EditText) findViewById(R.id.EditText02); txt.setText(\"我用自己的程序试试发短信。\"); snd = (Button) findViewById(R.id.Button01); snd.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { String phoneNo = tel.getText().toString(); String message = txt.getText().toString(); if (phoneNo.length()>0 && message.length()>0){ } } }); } private void sendSMS(String address, String content) { SmsManager manager = SmsManager.getDefault(); Intent i = new Intent(SMS_ACTION); //生成PendingIntent,当消息发送完成,接收到广播 PendingIntent sentIntent = PendingIntent.getBroadcast( sendSMS(phoneNo, message); Toast.makeText(TinySMS.this, \"请重新输入电话号码和短信内容\", Toast.LENGTH_LONG).show(); } else { 第 41 页
} } this, 0, i, PendingIntent.FLAG_ONE_SHOT); manager.sendTextMessage( address, null, content, sentIntent, null); 如果要收发短信,还需在AndroidManifest.xml中声明权限:
2、手机上有多种传感器,可以对这些传感器进行编程。 Android SDK 中提供的面向硬件的特性 特性 android.hardware.Camera 描述 相机交互的类,可以截取照片、获取预览屏幕的图像,修改理相机操作的参数。 android.hardware.SensorManager 允许访问 Android 平台传感器的类。并非所有配备 Android 的设备都支持 SensorManager 中的所有传感器。 android.hardware.SensorListener 在传感器值实时更改时,希望接收更新的类要实现的接口。用以监视第 42 页
硬件中一个或多个可用传感器。 android.media.MediaRecorder android.FaceDetector android.os.* 用于录制媒体的类。 人脸进行基本识别类。 可以与操作环境交互的包,包括电源管理、文件查看器、处理器和消息类。 android.hardware.SensorManager 包含几个常量,这表示 Android 传感器系统的不同方面,包括:
传感器类型:方向、加速表、光线、磁场、临近性、温度等。采样率最快、游戏、普通、用户界面。
当应用程序请求特定的采样率时,其实只是对传感器子系统的一个提示,或者一个建议。不保证特定的采样率可用。准确性高、低、中、不可靠。 SensorListener 接口是传感器应用程序的中心。它包括两个必需方法:
onSensorChanged(int sensor,float values[]) 方法在传感器值更改时调用。该方法只对受此应用程序监视的传感器调用。该方法的参数包括:
一个整数,指示更改的传感器; 一个浮点值数组,表示传感器数据本身。有些传感器只提供一个数据值,
另一些则提供三个浮点值。方向和加速表传感器都提供三个数据值。
当传感器的准确性更改时,将调用 onAccuracyChanged(int sensor,int accuracy) 方法。参数包括两个整数:一个表示传感器,另一个表示该传感器新的准确值。
要与传感器交互,应用程序必须注册以侦听与一个或多个传感器相关的活动。注册使用 SensorManager 类的 registerListener 方法完成。
并非所有支持 Android 的设备都支持 SDK 中定义的所有传感器。
以 Android 为中心的传感器系统
相机拍摄: package com.android.cameraAndroid; import android.app.Activity; import android.os.Bundle; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import android.content.Context; 第 43 页
import android.content.Intent; import android.graphics.PixelFormat; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.hardware.Camera.PictureCallback; import android.hardware.Camera.ShutterCallback; import android.media.AudioManager; import android.media.ToneGenerator; import android.net.Uri; import android.os.Environment; import android.os.StatFs; import android.view.Menu; import android.view.MenuItem; import android.view.SurfaceHolder; import android.view.SurfaceView; public class CameraAndroid extends Activity { private CameraPreview preview; private Camera camera; private ToneGenerator tone; private static final int OPTION_SNAPSHOT = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); preview = new CameraPreview(this); setContentView(preview); } @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); switch(itemId){ case OPTION_SNAPSHOT: //拍摄照片 camera.takePicture(shutterCallback, null, jpegCallback); break; } return true; } //返回照片的JPEG格式的数据 private PictureCallback jpegCallback = new PictureCallback(){ 第 44 页
public void onPictureTaken(byte[] data, Camera camera) { Parameters ps = camera.getParameters(); if(ps.getPictureFormat() == PixelFormat.JPEG){ //存储拍照获得的图片 String path = save(data); //将图片交给Image程序处理 Uri uri = Uri.fromFile(new File(path)); Intent intent = new Intent(); intent.setAction(\"android.intent.action.VIEW\"); intent.setDataAndType(uri, \"image/jpeg\"); startActivity(intent); } } }; //快门按下的时候onShutter()被回调 private ShutterCallback shutterCallback = new ShutterCallback(){ public void onShutter() { if(tone == null) //发出提示用户的声音 tone = new ToneGenerator(AudioManager.STREAM_MUSIC, ToneGenerator.MAX_VOLUME); tone.startTone(ToneGenerator.TONE_PROP_BEEP2); } }; private String save(byte[] data){ String path = \"/sdcard/\"+System.currentTimeMillis()+\".jpg\"; try { //判断SD卡上是否有足够的空间 String storage = Environment.getExternalStorageDirectory().toString(); StatFs fs = new StatFs(storage); long available = fs.getAvailableBlocks()*fs.getBlockSize(); if(available public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { //已经获得Surface的width和height,设置Camera的参数 Camera.Parameters parameters = camera.getParameters(); parameters.setPreviewSize(w, h); camera.setParameters(parameters); //开始预览 camera.startPreview(); } } } 拍摄模拟: 第 47 页 因篇幅问题不能全部显示,请点此查看更多更全内容