一、 概述
地图应用在android开发中占有很重要的地位,用的很广泛,并且在1.5中,有了一些改动,现在做一个总结。
Android在 sdk1.5的预装的 add-on中提供了一个 Map扩展库 com.google.android.maps,利用它你就可以给你的 android应用程序增加上强大的地图功能了。这个库的位置在 Your-SDK_DIR\add-ons\google_apis-3\libs.
需要说明的是这个库不是标准的 android
sdk的内容,你也可以自己从这里 并放到你的 sdk里面。
一旦以已经安装了 google APIs add-on,你就可以为你新建的应用或者已有的应用加上地图功能了。由于上面提到的这个 maps库不是标准的 android sdk的内容,而是 api add-on里面的,所以为了使你的应用能够找到这个库,必须设置你的工程的 build target为 Google
APIS, 下面说一下如何设置 android应用程序的属性。
-
如果是为已有的应用加上地图功能,右键点击你的项目,选择“属性” ->“ android”,然后为你的应用选择 build target为 "Google
APIs"
-
如果是新建一个项目,同样需要在第一步选择 build
target为 "Google
APIs"
当然,在运行时你还需要为这个应用创建一个类型为 google
api的 avd,具体方法可参考这里 http://blog.chinaunix.net/u/20947/showart_1927099.html 。
二、注意事项
下面介绍在程序开发中要注意的一些问题:
-
首先是必须要申请一个 map api key, 具体方法可参考这里: http://blog.chinaunix.net/u/20947/showart_1956041.html
-
其次,是一定要在 manifest.xml中设置全相应的权限,比如:
< uses-permission android:name= "android.permission.ACCESS_COARSE_LOCATION" / >
< uses-permission android:name= "android.permission.INTERNET" / >
还有要在manifest.xml中加上要用的 maps库: < manifest xmlns:android= ""
package= "com.example.package.name" >
. . .
< application android:name= "MyApplication" >
< uses-library android:name= "com.google.android.maps" / >
. . .
< / application>
. . .
< / manifest>
三、Maps库分析
Maps库提供了十几个类,具体可以参考这里 , 包括 Mapview, MapController, MapActivity等。
Mapview 是用来显示地图的 view, 它也是派生自 android.view.ViewGroup。
地图可以以不同的形式来显示出来,如街景模式,卫星模式等,具体方法可以参考:
,
,
and
MapView只能被 MapActivity来创建,这是因为 mapview需要通过后台的线程来连接网络或者文件系统,而这些线程要由 mapActivity来管理。
需要特别说明的一点是,android 1.5中,map的zoom采用了built-in机制,可以通过来设置是否在地图上显示zoom控件。
MapActivity是一个抽象类,任何想要显示MapView的activity都需要派生自MapActivity。并且在其派生类的onCreate()中,都要创建一个MapView实例,可以通过MapView
constructor (then add it to a layout View with ViewGroup.addView(View) ) 或者通过layout XML来创建。
四、实例分析
最后,按照惯例,还是用一个小程序来演示一下 android中地图功能的开发。主要功能是实现了地图的缩放,添加了菜单,从而可以手动选择地图的显示模式等。
Step
1: 新建一个 android project, 注意这里要选择的 build
target为 "Google
APIs"
Step 2: 修改 menifest文件:
< ? xml version = "1.0" encoding = "utf-8" ? >
< manifest xmlns:android= ""
package= "com.map.prac"
android:versionCode= "1"
android:versionName= "1.0" >
< uses-permission android:name= "android.permission.ACCESS_COARSE_LOCATION" / >
< uses-permission android:name= "android.permission.INTERNET" / >
< application android:icon= "@drawable/icon" android:label= "@string/app_name" >
< uses-library android:name= "com.google.android.maps" / >
< activity android:name= ".MapViewPrac2"
android:label= "@string/app_name" >
< intent-filter>
< action android:name= "android.intent.action.MAIN" / >
< category android:name= "android.intent.category.LAUNCHER" / >
< / intent-filter>
< / activity>
< / application>
< uses-sdk android:minSdkVersion= "3" / >
< / manifest>
Step 3: 修改 layout文件, main.xml
< ? xml version = "1.0" encoding = "utf-8" ? >
< LinearLayout xmlns:android= ""
android:id= "@+id/main"
android:layout_width= "fill_parent"
android:layout_height= "fill_parent" >
< com. google. android. maps. MapView
android:id= "@+id/map"
android:layout_width= "fill_parent"
android:layout_height= "fill_parent"
android:enabled= "true"
android:clickable= "true"
android:apiKey= "???????????????????????????????????"
/ >
< / LinearLayout>
这里需要将 api key中的 ????????????改成你自己申请到的 api key. 关于如何申请可参考这里: http://blog.chinaunix.net/u/20947/showart_1956041.html
Step
4: 修改代码:
package com. map . prac;
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 android. app. AlertDialog;
import android. app. Dialog ;
import android. content. DialogInterface;
import android. os. Bundle;
import android. util . Log ;
import android. view . KeyEvent ;
import android. view . Menu ;
import android. view . MenuItem ;
public class MapViewPrac2 extends MapActivity {
private final String TAG = "MapPrac" ;
private MapView mapView = null ;
private MapController mc;
//Menu items
final private int menuMode = Menu . FIRST ;
final private int menuExit = Menu . FIRST + 1;
final private int menuCommandList = Menu . FIRST + 2;
private int chooseItem = 0;
/** Called when the activity is first created. */
@Override
public void onCreate( Bundle savedInstanceState) {
super . onCreate( savedInstanceState) ;
setContentView( R. layout . main) ;
mapView = ( MapView) findViewById( R. id . map ) ;
mc = mapView. getController ( ) ;
mapView. setTraffic( true) ; //
mapView. setSatellite( false) ;
mapView. setStreetView( true) ;
//GeoPoint gp = new GeoPoint((int)(39.269259 * 1000000), (int)(115.255762 * 1000000));//yixian
GeoPoint gp = new GeoPoint( ( int ) ( 39. 95 * 1000000) , ( int ) ( 116. 37 * 1000000) ) ; //beijing
//mc.animateTo(gp);
//mc.setZoom(12);
mc. setCenter( gp) ;
//to display zoom control in MapView
mapView. setBuiltInZoomControls( true) ;
}
@Override
public boolean onKeyDown( int keyCode, KeyEvent event ) {
// TODO Auto-generated method stub
Log . i( TAG, "enter onKeyDown" ) ;
return super . onKeyDown( keyCode, event ) ;
}
@Override
public boolean onCreateOptionsMenu( Menu menu ) {
menu . add ( 0, menuMode, 0, "Map Mode" ) ;
menu . add ( 0, menuCommandList, 1, "Command List" ) ;
menu . add ( 0, menuExit, 2, "Exit" ) ;
return super . onCreateOptionsMenu( menu ) ;
}
@Override
public boolean onMenuItemSelected( int featureId, MenuItem item ) {
// TODO Auto-generated method stub
switch ( item . getItemId( ) )
{
case menuMode:
Dialog dMode = new AlertDialog. Builder( this )
//.setIcon(R.drawable.alert_dialog_icon)
. setTitle ( R. string . alert_dialog_single_choice)
. setSingleChoiceItems( R. array . select_dialog_items2, chooseItem, new DialogInterface. OnClickListener( ) {
public void onClick( DialogInterface dialog , int whichButton) {
Log . i( TAG, "choose button is " + whichButton) ;
chooseItem = whichButton;
/* User clicked on a radio button do some stuff */
}
} )
. setPositiveButton( R. string . alert_dialog_ok, new DialogInterface. OnClickListener( ) {
public void onClick( DialogInterface dialog , int whichButton) {
/* User clicked Yes so do some stuff */
Log . i( TAG, "item = " + chooseItem) ;
switch ( chooseItem)
{
case 0:
mapView. setSatellite( false) ;
break ;
case 1:
mapView. setSatellite( true) ;
break ;
case 2:
mapView. setTraffic( true) ;
break ;
case 3:
mapView. setStreetView( true) ;
break ;
default :
break ;
}
}
} )
. setNegativeButton( R. string . alert_dialog_cancel, new DialogInterface. OnClickListener( ) {
public void onClick( DialogInterface dialog , int whichButton) {
/* User clicked No so do some stuff */
}
} )
. create ( ) ;
dMode. show ( ) ;
break ;
case menuCommandList:
//create the dialog
Dialog d = new AlertDialog. Builder( this )
. setTitle ( R. string . select_dialog)
. setItems( R. array . select_dialog_items, new DialogInterface. OnClickListener( ) {
public void onClick( DialogInterface dialog , int which) {
/* User clicked so do some stuff */
String [ ] items = getResources ( ) . getStringArray ( R. array . select_dialog_items) ;
/*new AlertDialog.Builder(this)
.setMessage("You selected: " + which + " , " + items[which])
.show();*/
Log . i( TAG, "you choose is: " + items[ which] ) ;
}
} )
. create ( ) ;
//show the dialog
d. show ( ) ;
break ;
case menuExit:
finish ( ) ;
break ;
default :
break ;
}
return super . onMenuItemSelected( featureId, item ) ;
}
@Override
protected boolean isRouteDisplayed( ) {
// TODO Auto-generated method stub
return false;
}
}
阅读(3489) | 评论(0) | 转发(0) |