昨晚受网友之托研究Android Map。

第一步:申请com.google.android.maps.MapView apiKey

获取debug keystore的位置:Eclipse——>Windows——>Perferences——>Android——>Build查看Default debug keystor,比如我的C:/Users/Administrator/.android/debug.keystore

在找到在cmd中运行keytool -list -alias androiddebugkey -keystore "C:/Users/Administrator/.android/debug.keystore" -storepass android -keypass android,路径上一定要加双引号

执行结果:

androiddebugkey, 2010-3-16, PrivateKeyEntry,
认证指纹 (MD5): XX:XX:XX:E3:XX:D5:XX:43:DF:5D:F0:97:XX:XX:5E:9E 这里就是你的认证指纹

打开打开http://code.google.com/intl/zh-CN/android/maps-api-signup.html,填写你刚刚生成的认证指纹就能获取apiKey了,这里需要登录Google Account,如果没有先申请一个.

我获取的结果是:

<com.google.android.maps.MapView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:apiKey="XXXXXXXXXXXXXXXXXXXXXX"
/>

第二步:一切准备就绪,只欠东风了.

新建Android项目,Target选择Google APIs,或者更改已有项目的Target为Google APIs,打开AndroidManifest.xml文件,

加入<uses-library android:name="com.google.android.maps" />和<uses-permission android:name="android.permission.INTERNET" />

我的是:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lhw.android"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<uses-library android:name="com.google.android.maps" />
<activity android:name=".MainActivity"
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-permission android:name="android.permission.INTERNET" />
</manifest>

将MapView加入界面,如main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<com.google.android.maps.MapView
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="0-P9Tg82hGa-l3pCqAV5jm7EEtIV8s1iOiTD-cQ"
/>
</RelativeLayout >

第三步:编写Activity,将你的Activtity继承自MapActivity,如:

package com.lhw.android;

import android.os.Bundle;

import com.google.android.maps.MapActivity;

public class MainActivity extends MapActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

@Override
protected boolean isRouteDisplayed() {
return false;
}

}

第四步:想要运行这个工程,还需要新建一个Google APIs AVD,这个在Eclipse里新建很简单,也可以用命令建(我当时在这用的以前的Android AVD导致地图显示不出来,呵呵)

第二个例子:实现Zoom功能

在main.xml中加入:

<LinearLayout
android:id="@+id/zoom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
/>

在MainActivity.java代码:

public class MainActivity extends MapActivity {
private MapView mapView;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

mapView=(MapView)this.findViewById(R.id.mapView);
LinearLayout zoomLayout=(LinearLayout)this.findViewById(R.id.zoom);
View zoomView=mapView.getZoomControls();
zoomLayout.addView(zoomView);
mapView.displayZoomControls(true);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}

}

Run,效果如图:

功能扩展:按下键盘↑,↓键实现Zoom功能,在onCreate方法中增加 mapView.setStreetView(true);或mapView.setSatellite(true)自定义显示

@Override
public boolean onKeyDown(int keyCode,KeyEvent event){
MapController mc=mapView.getController();
switch(keyCode){
case KeyEvent.KEYCODE_DPAD_UP:
mc.zoomIn();
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
mc.zoomOut();
break;
}
return super.onKeyDown(keyCode, event);
}

第三个例子:在屏幕上打点(因为在现在正在做的GIS项目中叫的“打点”,哈哈):

1)自动打点

package com.lhw.android;

import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

public class MainActivity extends MapActivity {
private MapView mapView;
private MapController mc;
private GeoPoint p;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

mapView=(MapView)this.findViewById(R.id.mapView);
mapView.setSatellite(true);
LinearLayout zoomLayout=(LinearLayout)this.findViewById(R.id.zoom);
View zoomView=mapView.getZoomControls();
zoomLayout.addView(zoomView,new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
mapView.displayZoomControls(true);
mc=mapView.getController();
String coordinates[]={"1.352566007", "103.78921587"};
double latitude=Double.parseDouble(coordinates[0]);
double longitude=Double.parseDouble(coordinates[1]);
p=new GeoPoint((int)(latitude*1E6),(int)(longitude*1E6));
mc.animateTo(p);
mc.setZoom(17);
mapView.invalidate();
}

@Override
public boolean onKeyDown(int keyCode,KeyEvent event){
switch(keyCode){
case KeyEvent.KEYCODE_DPAD_UP:
mc.zoomIn();
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
mc.zoomOut();
break;
}
return super.onKeyDown(keyCode, event);
}

@Override
protected boolean isRouteDisplayed() {
return false;
}

}

2)在打点出显示图标

package com.lhw.android;

import java.util.List;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;

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 MainActivity extends MapActivity {
private MapView mapView;
private MapController mc;
private GeoPoint p;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

mapView=(MapView)this.findViewById(R.id.mapView);
mapView.setStreetView(true);
LinearLayout zoomLayout=(LinearLayout)this.findViewById(R.id.zoom);
View zoomView=mapView.getZoomControls();
zoomLayout.addView(zoomView,new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
mapView.displayZoomControls(true);
mc=mapView.getController();
String coordinates[]={"1.352566007", "103.78921587"};
double latitude=Double.parseDouble(coordinates[0]);
double longitude=Double.parseDouble(coordinates[1]);
p=new GeoPoint((int)(latitude*1E6),(int)(longitude*1E6));
mc.animateTo(p);
mc.setZoom(17);

//加入新的图层(我这样理解的)
MapOverlay mapOverlay=new MapOverlay();
List<Overlay> listOfOverlays=mapView.getOverlays();
listOfOverlays.clear();
listOfOverlays.add(mapOverlay);

mapView.invalidate();
}

@Override
public boolean onKeyDown(int keyCode,KeyEvent event){
switch(keyCode){
case KeyEvent.KEYCODE_DPAD_UP:
mc.zoomIn();
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
mc.zoomOut();
break;
}
return super.onKeyDown(keyCode, event);
}

@Override
protected boolean isRouteDisplayed() {
return false;
}

//新加代码,创建新图层类
class MapOverlay extends Overlay{
@Override
public boolean draw(Canvas canvas,MapView mapView,boolean shadow,long when){
super.draw(canvas, mapView, shadow);
Point screenPts=new Point();
mapView.getProjection().toPixels(p, screenPts);
Bitmap bmp=BitmapFactory.decodeResource(getResources(),R.drawable.mark);
canvas.drawBitmap(bmp,screenPts.x,screenPts.y-30,null);
return true;
}
}
}

3)显示打点坐标

在MapOverlay类中增加以下方法

@Override
public boolean onTouchEvent(MotionEvent event,MapView mapView){
if(event.getAction()==1){
GeoPoint p=mapView.getProjection().fromPixels((int)event.getX(),(int)event.getY());
Toast.makeText(getBaseContext(),p.getLatitudeE6()/1E6+","+p.getLongitudeE6()/1E6, Toast.LENGTH_SHORT).show();
}
return false;
}

4)显示坐标所在地

修改MapOver类的onTouchEvent方法:

@Override
public boolean onTouchEvent(MotionEvent event,MapView mapView){
if(event.getAction()==1){
GeoPoint p=mapView.getProjection().fromPixels((int)event.getX(),(int)event.getY());
Geocoder geoCoder=new Geocoder(getBaseContext(),Locale.getDefault());
try{
List<Address> addresses=geoCoder.getFromLocation(p.getLatitudeE6()/1E6, p.getLongitudeE6()/1E6,1);
String add="";
if(addresses.size()>0){
for(int i=0;i<addresses.get(0).getMaxAddressLineIndex();i++){
add+=addresses.get(0).getAddressLine(i)+"/n";
}
}
Toast.makeText(getBaseContext(), add, Toast.LENGTH_LONG).show();
//Toast.makeText(getBaseContext(),p.getLatitudeE6()/1E6+","+p.getLongitudeE6()/1E6, Toast.LENGTH_SHORT).show();
}catch(Exception e){
e.printStackTrace();
}
return true;
}else{
return false;
}
}

5)根据地址在地图上定位坐标:

public boolean onTouchEvent(MotionEvent event,MapView mapView){
if(event.getAction()==1){
GeoPoint p=mapView.getProjection().fromPixels((int)event.getX(),(int)event.getY());
Geocoder geoCoder=new Geocoder(getBaseContext(),Locale.getDefault());
try {
List<Address> addresses = geoCoder.getFromLocationName(
"empire state building", 5);
String add = "";
if (addresses.size() > 0) {
p = new GeoPoint(
(int) (addresses.get(0).getLatitude() * 1E6),
(int) (addresses.get(0).getLongitude() * 1E6));
mc.animateTo(p);
mapView.invalidate();
}
} catch (IOException e) {
e.printStackTrace();
}
return true;
}else{
return false;
}
}

主要参考http://mobiforge.com/developing/story/using-google-maps-android,本来想再研究研究但是头晕了。休息会儿,看日语。明天又继续上班了。唉!

更多相关文章

  1. TextView的走马灯效果
  2. ImageView的属性android:scaleType
  3. Android开发中XML布局的常用属性说明
  4. ImageView的属性android:scaleType,即ImageView.setScaleType(Ima
  5. android 横竖屏限制如何配置
  6. 【转】Android字体小结
  7. android 一直在最前面的浮动窗口效果
  8. android 在TextView中显示EditText,通过Button按键,更改TextView
  9. ImageView.setScaleType(ImageView.ScaleType)

随机推荐

  1. 识别链接,可以点击TextView
  2. Android的网络与通信
  3. Android和Linux kernel版本对应表
  4. 2.3.1 Android(安卓)Studio使用记录——1
  5. android SharedPreferences
  6. Android类库介绍
  7. Android开发中 获取当前Android的年月日
  8. 在jitpack创建Android仓库
  9. Android(安卓)模拟器中AVD路径的修改
  10. Android中处理崩溃异常