您的位置:首页 > 移动开发 > Android开发

Android Map开发基础知识学习笔记

2013-04-20 13:10 681 查看
注册Android地图API密钥



运行:keytool-list-keystore~/.android/debug.keystore

用得到的MD5码到http://code.google.com/intl/zh-CN/android/maps-api-signup.html注册API密钥。参考:

http://www.cnblogs.com/feisky/archive/2010/01/17/1650083.html



注册完成后会得到如下的网页:

您的密钥是:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
此密钥适用于所有使用以下指纹所对应证书进行验证的应用程序:

XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
下面是一个xml格式的示例,帮助您了解地图功能:

<com.google.android.maps.MapView

android:layout_width="fill_parent"

android:layout_height="fill_parent"
android:apiKey="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

/>



模拟器设置



建立一个"GoogleInc.:GoogleAPIs:3"的模拟器。



手机终端需要支持GoogleAdd-ons



作为与Google合作的手机终端的制造商,如果想在自己的Android终端中集成Google的一些应用,例如map,market,picasa,sync等,需要和Google签约,这样Google会有专人帮你将这一系列服务整合到你的平台中来。



作为没有和Google合作的手机终端的制造商,我们可以使用破解的方法将Add-ons中的运行库整合到自己的framework中来(build到手机终端的system.img中)。操作如下:



1.在Android中,额外支持GoogleAdd-ons(GoogleMaps),需要将如下档案(从标准的SDK中pull出来的,也可以从GPhone中pull出来)打包进System.img。GoogleAdd-ons只需要1--2,GoolgeMaps(Google的地图程序)需要1--5:

1)system/frameworkcom.google.android.maps.jar

2)system/etc/permissionscom.google.android.maps.xml

3)system/frameworkcom.google.android.gtalkservice.jar

4)system/etc/permissionscom.google.android.gtalkservice.xml

5)system/appMaps.apk(GoogleMapsv3.0)



2.源码:AndroidCupcakeRelease(经测试,在donut平台同样适用。)

1)编译源码(为了生成out/target目录中Android最原始的东西)

2)将以上文件加入out/target/product/generic相应目录,在源码根目录使用makesnod打包,获得新的system.img



权限和Maps库设置



在manifest.xml中设置全相应的权限,比如:



<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permissionandroid:name="android.permission.INTERNET"/>


在manifest.xml中加上要用的maps库:



<manifestxmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.package.name">

...

<applicationandroid:name="MyApplication">

<uses-libraryandroid:name="com.google.android.maps"/>

...

</application>

...

</manifest>



Maps库分析



Maps库提供了十几个类,具体可以参考这里http://code.google.com/intl/ja/android/add-ons/google-apis/reference/index.html,包括Mapview,MapController,MapActivity等。



(1)MapController



控制地图移动,伸缩,以某个GPS坐标为中心,控制MapView中的view组件,管理Overlay,提供View的基本功能。使用多种地图模式(地图模式(某些城市可实时对交通状况进行更新),卫星模式,街景模式)来查看GoogleMap。



常用方法:animateTo(GeoPointpoint)setCenter(GeoPointpoint)setZoom(intzoomLevel)等。



(2)MapView



Mapview是用来显示地图的view,它派生自android.view.ViewGroup。当MapView获得焦点,可以控制地图的移动和缩放。



地图可以以不同的形式来显示出来,如街景模式,卫星模式等,通过setSatellite(boolean)setTraffic(boolean),setStreetView(boolean)方法。



MapView只能被MapActivity来创建,这是因为mapview需要通过后台的线程来连接网络或者文件系统,而这些线程要由mapActivity来管理。



需要特别说明的一点是,android1.5中,map的zoom采用了built-in机制,可以通过setBuiltInZoomControls(boolean)来设置是否在地图上显示zoom控件。



常用方法:getController()getOverlays()setSatellite(boolean)setTraffic(boolean),setStreetView(boolean)setBuiltInZoomControls(boolean)等。



(3)MapActivity



管理Activity的生命周期,为mapview建立及取消对mapservice的连接。



MapActivity是一个抽象类,任何想要显示MapView的activity都需要派生自MapActivity。并且在其派生类的onCreate()中,都要创建一个MapView实例,可以通过MapViewconstructor(然后添加到View中ViewGroup.addView(View))或者通过layoutXML来创建。



(4)Overlay



Overlay是覆盖到MapView的最上层,可以扩展其ondraw接口,自定义在MapView中显示一些自己的东西。MapView通过MapView.getOverlays()对Overlay进行管理。



除了Overlay这个基类,Google还扩展了2个比较有用的Overlay



1)MylocationOverlay—集成了Android.location中接收当前坐标的接口,集成SersorManager中CompassSensor的接口

我们只需要enableMyLocation(),enableCompass就可以让我们的程序拥有实时的MyLocation以及Compass功能(Activity.onResume()中)。



2)ItemlizedOverlay—管理一个OverlayItem链表,用图片等资源在地图上作风格相同的标记。



(5)Projection:MapView中GPS坐标与设备坐标的转换(GeoPoint和Point)。



一个简单的小例子



用一个小程序来演示一下android中地图功能的开发。主要功能是实现了地图的缩放,添加了菜单,从而可以手动选择地图的显示模式等。



Step1:新建一个androidproject,注意这里要选择的buildtarget为"GoogleAPIs"



Step2:修改menifest文件:



<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.map.prac"android:versionCode="1"android:versionName="1.0"><uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permissionandroid:name="android.permission.INTERNET"/>


<applicationandroid:icon="@drawable/icon"android:label="@string/app_name"><uses-libraryandroid:name="com.google.android.maps"/><activityandroid:name=".MapViewPrac2"android:label="@string/app_name"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application><uses-sdkandroid:minSdkVersion="3"/></manifest>



Step3:修改layout文件,main.xml



<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/main"android:layout_width="fill_parent"android:layout_height="fill_parent"><com.google.android.maps.MapViewandroid:id="@+id/map"android:layout_width="fill_parent"android:layout_height="fill_parent"android:enabled="true"android:clickable="true"android:apiKey="???????????????????????????????????"/></LinearLayout>



这里需要将apikey中的????????????改成你自己申请到的apikey.



Step4:修改代码:

packagefeisky.navigation;importcom.google.android.maps.GeoPoint;importcom.google.android.maps.MapActivity;importcom.google.android.maps.MapController;importcom.google.android.maps.MapView;importandroid.app.AlertDialog;importandroid.app.Dialog;importandroid.content.DialogInterface;importandroid.os.Bundle;importandroid.view.KeyEvent;importandroid.view.Menu;importandroid.view.MenuItem;publicclassMainActivityextendsMapActivity{		//地图显示控制相关变量定义	privateMapViewmap=null;	privateMapControllermapCon;		//菜单项	finalprivateintmenuMode=Menu.FIRST;	finalprivateintmenuExit=Menu.FIRST+1;	privateintchooseItem=0;	/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);//获取MapViewmap=(MapView)findViewById(R.id.map);//设置显示模式map.setTraffic(true);map.setSatellite(false);map.setStreetView(true);//设置可以缩放map.setBuiltInZoomControls(true);//设置初始地图的中心位置GeoPointgeoBeijing=newGeoPoint((int)(39.95*1000000),(int)(116.37*1000000));mapCon=map.getController();mapCon.setCenter(geoBeijing);}@Override	publicbooleanonCreateOptionsMenu(Menumenu){		//建立菜单	menu.add(0,menuMode,0,"地图模式");		menu.add(0,menuExit,1,"退出");		returnsuper.onCreateOptionsMenu(menu);	}	@Override	publicbooleanonKeyDown(intkeyCode,KeyEventevent){		returnsuper.onKeyDown(keyCode,event);	}	@Override	publicbooleanonMenuItemSelected(intfeatureId,MenuItemitem){		switch(item.getItemId()){		casemenuExit:			finish();			break;		casemenuMode:			DialogdMode=newAlertDialog.Builder(this)			.setTitle("地图模式设置")			.setSingleChoiceItems(R.array.MapMode,chooseItem,newDialogInterface.OnClickListener()			{								@Override				publicvoidonClick(DialogInterfacedialog,intwhich){					chooseItem=which;				}			})			.setPositiveButton("确定",newDialogInterface.OnClickListener()			{								@Override				publicvoidonClick(DialogInterfacedialog,intwhich){					switch(which){					case0:						map.setSatellite(true);						//map.setTraffic(false);						//map.setStreetView(false);						break;					case1:						//map.setSatellite(false);						map.setTraffic(true);						//map.setStreetView(false);						break;					case2:						//map.setSatellite(false);						//map.setTraffic(false);						map.setStreetView(true);						break;					default:						break;					}				}			})			.setNegativeButton("取消",newDialogInterface.OnClickListener(){								@Override				publicvoidonClick(DialogInterfacedialog,intwhich){									}			})			.create();			dMode.show();			break;		default:			break;		}		returnsuper.onMenuItemSelected(featureId,item);	}	@Override	protectedbooleanisRouteDisplayed(){		returnfalse;	}}







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: