Android使用Google Map服务 - 根据GPS信息在地图上定位
自暑假7月7日开始,到今天的8月7日,整个一个月,我总算是学到了Google Map这部分的内容。原本挺兴奋的,却被注册api key的网页显示错误弄得挺无聊,还好网上的能人多,搜了一下子就找到了解决方案,挺感激的,泪牛满面啊。这样我就可以继续这部分的学习。
在使用Google Map服务之前要做一些必要的准备
1.获取Map API Key
2.创建支持Google Map API 的AVD
关于获取Map API Key 的方法前面的博客已经有所介绍,也就不另外总结了,创建AVD,我想有过一段事件的Android学习的人肯定知道的,也不想多说。
下面是一个使用Google Map的简单例子,亲测成功!!!
创建项目:LocationMap
运行项目效果图:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"><LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal"><TextView android:text="@string/txtLong" android:layout_width="wrap_content" android:layout_height="wrap_content"/><!-- 定义输入经度值的文本框 --> <EditText android:id="@+id/lng" android:text="@string/lng" android:layout_width="85px" android:layout_height="wrap_content" /><TextView android:text="@string/txtLat" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="8px" /><!-- 定义输入纬度值的文本框 --><EditText android:id="@+id/lat" android:text="@string/lat" android:layout_width="85px" android:layout_height="wrap_content" /><Button android:id="@+id/loc" android:text="@string/loc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="4" /> </LinearLayout><LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal"><!-- 定义选择地图类型的单选框组 --><RadioGroup android:id="@+id/rg" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"><RadioButton android:text="@string/normal" android:id="@+id/normal" android:checked="true" android:layout_width="wrap_content" android:layout_height="wrap_content"/><RadioButton android:text="@string/satellite" android:id="@+id/satellite" android:layout_width="wrap_content" android:layout_height="wrap_content"/></RadioGroup></LinearLayout><!-- 定义一个MapView,注意apiKey必须是用户自己申请的 --><com.google.android.maps.MapView android:id="@+id/mv" android:clickable="true" android:enabled="true" android:layout_width="fill_parent" android:layout_height="fill_parent" android:apiKey="0RgnU2CyaG_2EmVilj8kShSS6JxagQv2i6SOzxw" /></LinearLayout>
package org.wwj.map;import java.util.List;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.RadioGroup;import android.widget.RadioGroup.OnCheckedChangeListener;import android.widget.Toast;import com.google.android.maps.GeoPoint;import com.google.android.maps.MapActivity;import com.google.android.maps.MapController;import com.google.android.maps.MapView;import com.google.android.maps.Overlay;public class LocationMap extends MapActivity { //定义界面上的可视化控件 Button locBn; RadioGroup mapType; MapView mv; EditText etLng, etLat; //定义MapController对象 MapController controller; Bitmap posBitmap; @Override protected void onCreate(Bundle icicle) { // TODO Auto-generated method stub super.onCreate(icicle); setContentView(R.layout.main); posBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pos); //获取界面的MapView对象 mv = (MapView) findViewById(R.id.mv); //获取界面上两个文本框 etLng = (EditText) findViewById(R.id.lng); etLat = (EditText) findViewById(R.id.lat); //设置显示放大、缩小控制按钮 mv.setBuiltInZoomControls(true); //创建MapController对象 controller = mv.getController(); //获取Button对象 locBn = (Button) findViewById(R.id.loc); locBn.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub //获取用户输入的经度、纬度值 String lng = etLng.getEditableText().toString().trim(); String lat = etLat.getEditableText().toString().trim(); if(lng.equals("") || lat.equals("")){ Toast.makeText(LocationMap.this, "请输入有效的经度、纬度!", Toast.LENGTH_LONG).show(); } else { double dLong = Double.parseDouble(lng); double dLat = Double.parseDouble(lat); //调用方法更新MapView updateMapView(dLong, dLat); } } }); //触发按钮的单击事件 locBn.performClick(); //获得RadioGroup对象 mapType = (RadioGroup) findViewById(R.id.rg); //为RadioGroup的选中状态改变添加监听器 mapType.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(RadioGroup group, int checkedId) { // TODO Auto-generated method stub switch(checkedId){ //如果勾选的是“正常视图”的单选按钮 case R.id.normal: mv.setSatellite(false); break; //如果勾选的是“卫星视图”的单选按钮 case R.id.satellite: mv.setSatellite(true); break; } } }); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return true; } //根据经度、纬度将MapView定位到指定地点的方法 private void updateMapView(double lng, double lat){ //将经纬度信息包装成GeoPoint对象 GeoPoint gp = new GeoPoint((int)(lat * 1E6), (int)(lng * 1E6)); //设置显示放大缩小按钮 mv.displayZoomControls(true); //将地图移动到指定的地理位置 controller.animateTo(gp); //获得MapView上原有的Overlay对象 List<Overlay> ol = mv.getOverlays(); //清除原有的overlay对象 ol.clear(); //添加一个新的overLay对象 ol.add(new PosOverLay(gp, posBitmap)); }}
package org.wwj.map;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Point;import com.google.android.maps.GeoPoint;import com.google.android.maps.MapView;import com.google.android.maps.Overlay;import com.google.android.maps.Projection;public class PosOverLay extends Overlay{ //定义该PosOverLay所绘制的位图 Bitmap posBitmap; //定义该PosOverLay绘制位图的位置 GeoPoint gp; public PosOverLay(GeoPoint gp, Bitmap posBitmap){ super(); this.gp = gp; this.posBitmap = posBitmap; } @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { // TODO Auto-generated method stub if(!shadow){ //获取MapView的Projection对象 Projection proj = mapView.getProjection(); Point p = new Point(); //将真实的地理坐标转换为屏幕上的坐标 proj.toPixels(gp, p); //在指定位置绘制图片 canvas.drawBitmap(posBitmap, p.x - posBitmap.getWidth() / 2 , p.y - posBitmap.getHeight() / 2, null); } }
完整manifest文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.wwj.map" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <uses-permission android:name="android.permission.INTERNET"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".LocationMap" android:label="@string/title_activity_location_map" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <uses-library android:name="com.google.android.maps"/> </application></manifest>