Android手机定位应用小解
来源:互联网 发布:sublime text写python 编辑:程序博客网 时间:2024/03/29 01:49
Android手机定位应用小解
让我们来看下android.location包下一些比较重要的功能类。
Android Location API:
以下是几个Android关于定位功能的包中比较重要的类:
LocationManager: 本类提供访问定位服务的功能,也提供 获取最佳定位提供者的功能。另外,临近警报功能 (前面所说的那种功能)也可以借助该类来实现。
LocationProvider: 该类是定位提供者的抽象类。定位提供者具备周期性报告设备地理位置的功能。
LocationListener: 提供定位信息发生改变时的回调功能。必须事先在定位管理器中注册监听器对象。
Criteria:该类使得应用能够通过在LocationProvider中设置的属性来选择合适的定位提供者。
Android也提供了一组访问 Google MAP的API,借助Google MAP及定位API,我们就能在地图上显示用户当前的地理位置:
Google Map API
Android中定义了一个名为com.google.android.maps的包,其中包含了一系列用于在Google Map上显示,控制和层叠信息的功能类,以下是该包中最重要的几个类:
MapActivity: 这个类是用于显示Google MAP的Activity类,它需要连接底层网络。
MapView: MapView是用于显示地图的View组件。它必须和MapActivity配合使用。
MapController : MapController用于控制地图的移动。
Overlay:这是一个可显示于地图之上的可绘制的对象。
GeoPoint: 这个一个包含经纬度位置的对象。
下面让我们来实际使用它们:
示例应用:
我们将来开发一个应用,它将能在Google Map上显示用户当前的位置。我们会通过使用Google Map API来显示地图,然后使用定位API来获取设备的当前定位信息以在Google Map上设置设备的当前位置。用户定位会随着用户的位置移动而发生改变。
Activity:
首先我们需要一个继承了MapActivity的Activity类:
class MyGPSActivity extends MapActivity {
…
}
要成功引用Google MAP API,我们必须先在AndroidManifest.xml中定义如下信息:
<uses-library android:name=”com.google.android.maps” />
使用MapView:
要让地图显示的话,我们得将MapView加入到应用中来,让我们在布局文件(main.xml)中加入如下代码:
<com.google.android.maps.MapView
android:id=”@+id/myGMap”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:enabled=”true”
android:clickable=”true”
android:apiKey=”API_Key_String”
/>
另外,要使用Google Map服务的话,我们需要一个API key。我们可以 通过如下方式获取API key:
1) 找到USER_HOME\Local Settings\Application Data\Android目录下的debug.keystore文件。
2) 使用keytool工具来生成认证信息(MD5),使用如下命令行:
keytool -list -alias androiddebugkey -keystore <path_to_debug_keystore>.keystore -storepass
android -keypass android
3) 打开 ‘Sign Up for the Android Maps API‘页面,输入之前生成的认证信息(MD5) 后将获取到你的API key。
4) 替换上面AndroidManifest.xml配置文件中“API_Key_String”为你刚才获取的API key。
让我们来继续补全MyGPSActivity类的代码,以使用MapView:
class MyGPSActivity extends MapActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
//创建并初始化地图
gMapView = (MapView) findViewById(R.id.myGMap);
GeoPoint p = new GeoPoint((int) (lat * 1000000), (int) (long * 1000000));
gMapView.setSatellite(true);
mc = gMapView.getController();
mc.setCenter(p);
mc.setZoom(14);
}
…
}
另外,要使用定位信息的话,必须设置一些权限,AndroidManifest.xml中的配置如下:
<uses-permission android:name=”android.permission.INTERNET”></uses-permission>
<uses-permission android:name=”android.permission.ACCESS_COARSE_LOCATION”></uses-permission>
<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION”></uses-permission>
使用定位管理器:
我们可以通过Context.getSystemService方法并传入Context.LOCATION_SERVICE参数获取定位管理器的实例:
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
之后,我们需要将我们原先的MyGPSActivity作一些修改,让它实现一个LocationListener接口,使其能够监听定位信息的改变:
class MyGPSActivity extends MapActivity implements LocationListener {
…
public void onLocationChanged(Location location) {}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
protected boolean isRouteDisplayed() {
return false;
}
}
让我们来添加一些代码,对LocationManager进行一些初始化工作,并在它的onCreate()方法中注册定位监听器。
@Override
public void onCreate(Bundle savedInstanceState) {
…
LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, this);
}
现在的代码中的onLocationChanged方法就会在用户的位置发生500米距离的改变之后进行调用。这里默认使用的 LocationProvider是“gps” (GSP_PROVIDER) ,不过你可以根据你的需要,使用特定的Criteria对象调用LocationManger类的getBestProvider方法获取其他的 LocationProvider。以下代码是onLocationChanged方法的参考实现:
public void onLocationChanged(Location location) {
if (location != null) {
double lat = location.getLatitude();
double lng = location.getLongitude();
p = new GeoPoint((int) lat * 1000000, (int) lng * 1000000);
mc.animateTo(p);
}
}
上面的代码用于获取当前的新位置并更新地图上的位置显示。
我们还可以为应用程序添加一些诸如缩放效果,地图标注,文本等功能。
添加缩放控件:
// 将缩放控件添加到地图上
ZoomControls zoomControls = (ZoomControls) gMapView.getZoomControls();
zoomControls.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
gMapView.addView(zoomControls);
gMapView.displayZoomControls(true);
添加Map Overlay:
下面的代码是定义一个overlay:
class MyLocationOverlay extends com.google.android.maps.Overlay {
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
super.draw(canvas, mapView, shadow);
Paint paint = new Paint();
// 将经纬度转换成实际屏幕坐标
Point myScreenCoords = new Point();
mapView.getProjection().toPixels(p, myScreenCoords);
paint.setStrokeWidth(1);
paint.setARGB(255, 255, 255, 255);
paint.setStyle(Paint.Style.STROKE);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.marker);
canvas.drawBitmap(bmp, myScreenCoords.x, myScreenCoords.y, paint);
canvas.drawText(”Here I am…”, myScreenCoords.x, myScreenCoords.y, paint);
return true;
}
}
上面的这个overlay会在地图上显示一个“Here I am”的文本。
让我们把这个overlay添加到地图上去:
MyLocationOverlay myLocationOverlay = new MyLocationOverlay();
List<Overlay> list = gMapView.getOverlays();
list.add(myLocationOverlay);
在模拟器上运行该应用程序:
运行模拟器,在Eclipse的DMMS视图的 ‘Emulator Control’窗口中我们可以输入经度和纬度值发送到模拟器上,之后模拟器的屏幕上就会根据这个经纬度来进行定位。
- Android手机定位应用小解
- Android手机应用开发之手机GPS定位
- 手机定位应用
- android手机定位
- android手机定位
- android手机定位
- android手机定位
- android 手机 GPS定位
- android手机定位
- android手机定位
- android手机定位
- Android手机定位
- android中手机定位
- android手机定位
- Android 手机定位
- 手机充电科学小解
- eclipse开发android手机定位
- Android手机定位完整代码
- 多语言文本编辑器EmEdtor
- 如何“打败”CAP定理
- git 中revert一个文件
- C++ 初学者指南 第三篇 (2) 项目3-3
- UIWebView的点击事件
- Android手机定位应用小解
- [USACO 1.4.1] Packing Rectangles
- Android 如何获取经纬度
- Android 取得手机屏幕大小
- php几个安全函数
- ADF中的算术计算问题
- 理解事务处理、事务处理的隔离级别,和使用JDBC进行事务处理
- CEdit类的一些用法
- java基本数据类型精度思考