资源描述
HEFEI UNIVERSITY
课程设计报告
系 别 电子信息与电气工程系
专 业 10级通信(2)班
姓 名 麻主席、张知奥、章飞
题 目 基于安卓平台的指南针的实现
学 号 1005073020
指 导 老 师 李祎
完 成 时 间 2014年1月4日
摘要:
基于安卓平台实现指南针的基本功能。
本文主要介绍本组如何通过模拟器在电脑上实现指南针应用的主要过程
关键词:
安卓、传感器、指南针
安卓简介
Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。目前,最新版本为Android 2.4 Gingerbread和Android 3.0 Honeycomb。
Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。
Android早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。 2011年初数据显示,仅正式上市两年的操作系统Android已经超越称霸十年的塞班系统,使之跃居全球最受欢迎的智能手机平台。现在,Android系统不但应用于智能手机,也在平板电脑市场急速扩张,在智能MP4方面也有较大发展。采用Android系统主要厂商包括台湾的HTC,(第一台谷歌的手机G1由HTC生产代工)美国摩托罗拉,SE等,中国大陆厂商如:魅族(M9),华为、中兴、联想、蓝魔等。
搭建Android开发平台
1 下载软件
n JDK 1.5+ 到 下载
n Eclipse 3.3(Europa) 到 http://www.eclipse.org/downloads/ 下载
n Android SDK 到 下载
2 安装软件和配置环境
2.1 安装JDK
下载好的JDK是一个可执行安装程序,双击安装。假设安装路径为:C:/Program Files/Java/jdk1.6.0_05(当然其他路径也可以)。
JDK安装完成之后要设置系统环境变量: 我的电脑点右键,选择“属性”,选择“高级”标签,进入环境变量设置。环境变量设置,分别设置三个环境变量:JAVA_HOME、path变量、classpath变量。
2.1.1 设置JAVA_HOME
在系统环境变量那一栏中点->新建JAVA_HOME (JAVA_HOME指向的是JDK的安装路径)。 变量名: JAVA_HOME;变量值: C:/Program Files/Java/jdk1.6.0_05
设置JAVA_HOME量的目的:
l 为了方便引用,比如,JDK安装C:/Program Files/Java/jdk1.6.0_05目录里,则设置JAVA_HOME为该目录路径, 那么以后要使用这个路径的时候, 只需输入%JAVA_HOME%即可, 避免每次引用都输入很长的路径串;
l 归一原则, 当JDK路径改变的时候, 仅需更改JAVA_HOME的变量值即可, 否则,就要更改任何用绝对路径引用JDK目录的文档, 要是万一没有改全, 某个程序找不到JDK, 后果是可想而知的----系统崩溃!
l 第三方软件会引用约定好的JAVA_HOME变量, 不然, 你不能正常使用该软件.
2.1.2 设置path变量
在系统变量里找到path变量,选择->编辑;(里面已经有很多的变量值,是在变量值的最前面或其他位置加上%JAVA_HOME%/bin;)。变量名:path ;变量值: %JAVA_HOME%/bin;
目的:使得我们能够在系统中的任何地方运行java应用程序,比如javac、java、javah等,这就要找到我们安装JDK的目录,比如我们的JDK安装在C:/Program Files/Java/jdk1.6.0_05目录下,那么在C:/Program Files/Java/jdk1.6.0_05/bin目录下就是我们常用的java应用程序,我们就需要把C:/jdk1.6.0/bin这个目录加到path环境变量里面。
2.1.3 设置classpath环境
在系统环境变量那一栏中点->新建classpath。变量名: classpath ;变量值:.;%JAVA_HOME%/lib/;%JAVA_HOME%/jre/lib/(注意,CLASSPATH最前面是有个“.”的,表示当前目录,这样当我们运行java AClass的时候,系统就会先在当前目录寻找AClass文件了。)
2.1.4 JDK环境测试
配置完成下面写一个简单的java程式来测试J2SDK是否已安装成功:
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello world!");
}
}
将程式保存为文档名为HelloWorld.java的文档。 打开命令提示符窗口,进入到HelloWorld.java所在目录,键入下面的命令:
javac HelloWorld.java
java HelloWorld
2.2 安装Eclipse
将下载的Eclipse压缩包解压到相应的安装目录即可。
2.3 配置Android环境
2.3.1 安装Android Development Tools (ADT)插件
启动eclipse,选择:Help > Software Updates > Find and Install....
在弹出的对话框中选择第二个选项:Search for new features to install,点击next,进入下一步。
选择New Remote Site,在弹出的对话框中键入远程站点的名字(任意,如Android Plugin),以及站点的URL:https://dl- Plugin 和Europe Discovery Site,然后点击finish,进入下一步搜索的过程,如以下图所示。
在搜索结果框中,选择Android Plugin,点击next进入下一步。如果有错误提示,则点击右侧工具栏中的Select Required(可能要等待几分钟),然后再点击next进入下一步,如以下图所示。
阅读和接受license agreements,点击next进入下一步。
确认安装路径,点击finish,出现下载框,如以下图所示。
在出现的验证框中,选择install all,开始安装,如以下图所示。
选择Yes,重启Eclipse
在Eclipse中,选择File -> New -> Project,在new project对话框中可查到Android project选项,如下图示,表示ADT插件安装成功。
2.3.2 应用Android SDK到eclipse
在Eclipse 工具栏中,选择:Window -> Preferences...
左边菜单中选中android,在右边浏览框中选择sdk的解压目录作为 sdk location,点击Apply,然后点击OK即可
3 参考资料:
具体编写操作
代码
一、 Activity_main.xml程序:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:id="@+id/Imageview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitCenter"
android:src="@drawable/compass" />
</LinearLayout>
此时acticity_main显示界面为
二、 MainActivity.java程序:
package pass;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
public class MainActivity extends Activity implements SensorEventListener {
private ImageView imageView;
SensorManager mSensorManager;
private float currentDegree=0f;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView=(ImageView)findViewById(R.id.Imageview);
mSensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
}
@SuppressWarnings("deprecation")
@Override
protected void onResume() {
mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_GAME);
super.onResume();
}
@Override
protected void onPause() {
mSensorManager.unregisterListener(this);
super.onPause();
}
@Override
protected void onStop() {
mSensorManager.unregisterListener(this);
super.onStop();
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
}
@SuppressWarnings("deprecation")
@Override
public void onSensorChanged(SensorEvent event) {
int sensortype=event.sensor.getType();
switch(sensortype){
case Sensor.TYPE_ORIENTATION:
float degree=event.values[0];
RotateAnimation ra=new RotateAnimation(currentDegree,-degree,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
ra.setDuration(200);
imageView.startAnimation(ra);
currentDegree=-degree;
break;
}
}
}
三、 compass Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="
package="pass"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/compass" android:label="@string/compass">
<activity android:name="MainActivity"
android:label="@string/compass">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
其中值得注意的有以下几点:
1. compass的project
2. Imageview添加
传感器的类型
各种类型的传感器:
1.加速度传感器 Sensor.TYPE_ACCELEROMETER:返回手机设备在X,Y,Z三个方向上的加速度.
2.磁场传感器,Sensor.TYPE_MAGNETIC_FIELD:,返回周围磁场在手机的X,Y,Z方向上的影响(磁场分量).
3.陀螺仪感应器:Sensor.TYPE_GYROSCOPE:
4.光线传感器 Sensor.TYPE_LIGHT:返回周围光的强度,单位是勒克斯lx
5.距离感应器Sensor.TYPE_PROXIMITY:
6.重力传感器Sensor.TYPE_GRAVITY:
7.线性加速传感器Sensor.TYPE_LINEAR_ACCELERATION:
8.旋转向量传感器Sensor.TYPE_ROTATION_VECTOR:
9.方向传感器:Sensor.TYPE_ORIENTATION:返
回三个值,第一个为和正北方向的角度,沿Z轴旋转,0表示正北,90度表示正东,180表示正南,270表示正西.
第二个值绕X轴倾斜,水平屏幕向上,返回0,抬起手机顶部时,值开始减小,范围0~-180,从手机底部开始抬起,值范围为0~180.
第三个值为手机左侧或者右侧翘起的高度.沿着Y轴倾斜,范围是-90~90,水平放置为0,从左侧抬起,会从0到-90,从右侧开始抬起,范围为0~90.
10.Sensor.TYPE_TEMPERATURE:温度传感器,返回摄氏度.
11.Sensor.TYPE_PRESSURE压力传感器,代表手机设备周围压力的大小
虽然AndroidSDK定义了十多种传感器,但并不是每一部手机都完全支持这些传感器。
传感器的使用
Android提供的API中对于不同传感器的调用都是用同一个接口,这样编程起来显得非常简单。先得到传感器的控制器,然后注册你感兴趣的感应事件,代码如下
SensorManager SensorManager
= (SensorManager)getSystemService(Context.SENSOR_SERVICE);
//注册方位角传感器,感应事件的周期是0.12s产生一次报告
mSensorManager.registerListener(mListener,
SensorManager.SENSOR_ORIENTATION,
SensorManager.SENSOR_DELAY_NORMAL
);
如果想要获得其他感应事件,只需要修改第二个参数为相应的传感器对应的枚举数值,第三个参数是感应事件的频率,设置感应事件频率,有四种频率模式可选,每个相差0.04s。然后设置一个监听器,利用监听接口onSensorChanged来读取具体感应的内容
public void onSensorChanged(int sensor, float[] values)
{
if (Config.DEBUG)
{
Log.d(TAG, "极方位角azimuth," + values[0]);
Log.d(TAG, "倾斜角pitch," + values[1]);
Log.d(TAG, "转角roll," + values[2]);
}
}
指南针应用
代码片段,双击复制
package com.ijowett.example.SystemService;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.hardware.Sensor;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Config;
import android.util.Log;
import android.view.View;
public class Compass extends Activity{
private static final String TAG = "Compass";
private SensorManager mSensorManager;
private SampleView mView;
private float[] mValues;
private final SensorListener mListener = new SensorListener() {
public void onSensorChanged(int sensor, float[] values) {
if (Config.DEBUG)
Log.d(TAG, "sensorChanged (" + values[0] + ", " + values[1] + ", " + values[2] + ")");
mValues = values;
if (mView != null) {
mView.invalidate();
}
}
public void onAccuracyChanged(int sensor, int accuracy) {
// TODO Auto-generated method stub
}
};
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
List sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
Log.d(TAG, "There are " + sensors.size() + " sensors.");
for(Sensor sens : sensors)
{
Log.d(TAG, "Sensor name: " + sens.getType());
Log.d(TAG, "Sensor name: " + sens.getName());
}
mView = new SampleView(this);
setContentView(mView);
}
@Override
protected void onResume()
{
if (Config.LOGD) Log.d(TAG, "onResume");
super.onResume();
mSensorManager.registerListener(mListener,
SensorManager.SENSOR_ORIENTATION,
SensorManager.SENSOR_DELAY_GAME);
}
@Override
protected void onStop()
{
if (Config.LOGD) Log.d(TAG, "onStop");
mSensorManager.unregisterListener(mListener);
super.onStop();
}
private class SampleView extends View {
private Paint mPaint = new Paint();
private Path mPath = new Path();
private boolean mAnimate;
private long mNextTime;
public SampleView(Context context) {
super(context);
// Construct a wedge-shaped path
mPath.moveTo(0, -50);
mPath.lineTo(-20, 60);
mPath.lineTo(0, 50);
mPath.lineTo(20, 60);
mPath.close();
}
@Override protected void onDraw(Canvas canvas) {
Paint paint = mPaint;
canvas.drawColor(Color.WHITE);
paint.setAntiAlias(true);
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.FILL);
int w = canvas.getWidth();
int h = canvas.getHeight();
int cx = w / 2;
int cy = h / 2;
canvas.translate(cx, cy);
if (mValues != null) {
canvas.rotate(-mValues[0]);
}
canvas.drawPath(mPath, mPaint);
}
@Override
protected void onAttachedToWindow() {
mAnimate = true;
super.onAttachedToWindow();
}
@Override
protected void onDetachedFromWindow() {
mAnimate = false;
super.onDetachedFromWindow();
}
}
}
传感器—监测装置
感受测量信息
按规律转换为电信号或其他形式的信息输出
自动监测和自动控制
Android 支持的传感器:
1.方向传感器
2.磁场传感器
3.温度传感器
4.光感传感器
5.压力传感器
获取SensorManager对象
getSysteService(Context.SENSOR_SERVICE)
获取传感器类型
getDefaultSensor(int type)
注册传感器
registerListener()
模拟
完成上述代码操作后,运行:
模拟器待机画面
模拟器主界面
模拟器程序界面
模拟器compass效果图
模拟器compass运行界面
功能
1、高精确度:专业航海指针,精确指南。
2、流畅操作:流畅的罗盘旋转,专业的传感器去噪处理,让您的指南针更精准。
3、智能校准:智能的校准提示(8字型环绕设备),提升您的指南针设备的精确度。
4、磁北正北:轻松的磁北正北转换。
5、误差校正:允许手动输入地磁偏角。
总结
通过这次课程设计,我对Android程序设计有了新的认识,尤其是传感器方面,弄懂了许多基础理论,不过自己还有很多方面不足。在这个循序渐进的过程中,解决了一些自己的认为比较难的地方后我又继续朝前行进着。课程设计终于在我们小组的努力下做完了。我更加深入的了解了Android的特点以及一些相关知识。
与其临渊羡鱼,不如退而结网。这次Android课程设计给我的最大的印象就是如果自己有了兴趣,就动手去做,在你的勇气和毅力下,困难是抬不了头的。如果你连失败都不怕了,那你还怕什么,拾起懒惰的心,勤奋就会走向成功。这次的课程设计在我未来的时日里,是一个标杆,因为它告诉了我,只要我努力没有什么事我做不好的。
最后我要感谢李祎老师对我们的辛勤培养,谢谢
参考网址
1.
2.
3.
4.
5.
6.
7.
展开阅读全文