Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1082186
  • 博文数量: 226
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 2504
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-21 14:12
文章分类

全部博文(226)

文章存档

2011年(1)

2010年(2)

2009年(68)

2008年(4)

2007年(27)

2006年(124)

我的朋友

分类: LINUX

2009-06-11 17:30:03

一、 概述


地图应用在android开发中占有很重要的地位,用的很广泛,并且在1.5中,有了一些改动,现在做一个总结。


Androidsdk1.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 targetGoogle APIS, 下面说一下如何设置android应用程序的属性。

-          如果是为已有的应用加上地图功能,右键点击你的项目,选择“属性”->android”,然后为你的应用选择build target"Google APIs"

-          如果是新建一个项目,同样需要在第一步选择build target"Google APIs"

当然,在运行时你还需要为这个应用创建一个类型为google apiavd,具体方法可参考这里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库提供了十几个类,具体可以参考这里,  包括MapviewMapControllerMapActivity等。

 

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;
    }
}



阅读(3482) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~