主要代码如下:
package com.easyway.android.google;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
/**
* 在定位方面可以通过LocationManager.GPS_PROVIDER和LocationManager.NETWORK_PROVIDER两种方式获取定位位置。
* 除了直接使用LocationManager提供的静态Provider(如GPS_PROVIDER和NETWORK_PROVIDER等)外,还可以使用我们自
* 己创建的LocationProvider对象。
*创建LocationProvider对象一般要先创建Criteria对象,来设置我们的LocationProvider要满足什么样的标准
*Criteria myCri=new Criteria();
*myCri.setAccuracy(Criteria.ACCURACY_FINE);//精确度
*myCri.setAltitudeRequired(false);//海拔不需要
*myCri.setBearingRequired(false);//Bearing是“轴承”的意思,此处可理解为地轴线之类的东西,总之Bearing Information
*是一种地理位置信息的描述
*myCri.setCostAllowed(true);//允许产生现金消费
*myCri.setPowerRequirement(Criteria.POWER_LOW);//耗电
*String myProvider=locMan.getBestProvider(myCri,true);
*
*
* 运行成功之后地图定位到当前所在位置
*
*
* 运行须知:
* 1.在创建项目时选择包含Google Api的Android SDK
* <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="GoogleAPK"
* />
* 2.必须具有访问地图和网络的权限程序需要实时的从Google地图库中读取信息,所以添加接入Internet权限。
* <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
* <uses-permission android:name="android.permission.INTERNET" />
* 3.在AndroidManifest.xml中配置必须添加香瓜的用于类库userlibary
* <uses-library android:name="com.google.android.maps" />
*
* 例如:
* <application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
* <uses-library android:name="com.google.android.maps" />
* <activity android:name=".AndroidGoogleMapActivity"
* 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>
* 4.AndroidGoogleMapActivity文件。在这个activity中我们继承了一个特别的类叫做:MapActivity 。
*
*
* @author longgangbai
*
*/
public class AndroidGoogleMapActivity extends MapActivity {
private MapView mapView;
MapController mapController;
/** 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.mapView);
this.mapView.setBuiltInZoomControls(true);//可以多点触摸放大
mapView.setSatellite(true);//使用卫星图
//1.定位地图中要查看的经纬度
GeoPoint point=new GeoPoint(39000000, 116000000);
this.mapController=mapView.getController();
this.mapController.animateTo(point);//通过动画方式移动到指定坐标
Log.i("welcome", "created map activity!");
//2.自动定位功能功能由于种种原因不可以
//获取定位设置对象
//Location location = getLocationManager();
//获取当前的经纬度
//getCurrentLocation(location);
//3.根据输入的地址查询相关的地址
queryLocationByAddress("苏州科技城高新软件园");
}
/**
* 根据地址查询相关的经纬度
* @param address
* @throws IOException
*/
public void queryLocationByAddress(String locationName)
{
//根据本地Locale获取地点
Locale locale=Locale.getDefault();
//创建Geocoder解析地址
Geocoder gc=new Geocoder(AndroidGoogleMapActivity.this,locale/* Locale.CHINA */);//Locale是java.util中的一个类
//gc.getFromLocation(latitude, longitude, 1);
List<Address> addressList;
try {
addressList = gc.getFromLocationName(locationName, 1);
StringBuilder buffer=new StringBuilder();
if(addressList!=null&&addressList.size()>0){
Address address=addressList.get(0);
for (int i=0;i<address.getMaxAddressLineIndex();i++) {
buffer.append(address.getAddressLine(i)).append(" \n");
}
double latitude=address.getLatitude()*1E6;//经度
double longitude=address.getLongitude()*1E6; //纬度
//定位到输入地址
queryAddressByLocation(new GeoPoint((int)latitude, (int)longitude));
//显示该地址的信息
buffer.append("经度为:"+latitude+"纬度为"+longitude).append("\n");
buffer.append(address.getLocality()).append("\n");
buffer.append(address.getPostalCode()).append("\n");
buffer.append(address.getCountryName ()).append("\n");
Log.v("tag", "latitude " + latitude + " longitude:" + longitude );
//创建对话框
AlertDialog.Builder builder=new Builder(AndroidGoogleMapActivity.this);
builder.setTitle("当前的经纬度")
.setMessage(buffer)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.create()
.show();
}
}catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取定位管理器
* @return
*/
private Location getLocationManager() {
Criteria mCriteria = new Criteria();
mCriteria.setAccuracy(Criteria.ACCURACY_FINE);
mCriteria.setAltitudeRequired(false);
mCriteria.setBearingRequired(false);
mCriteria.setCostAllowed(true);
mCriteria.setPowerRequirement(Criteria.POWER_LOW);
//获取定位管理器
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.getBestProvider(mCriteria, true);
//基于GPS定位的功能的
//GPS功能必须开启,在真机才可以模拟
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(location==null){
//采用基于网络的,必须在公共上ip注册的才可以使用此种方式
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
return location;
}
/**
*
* @param latitude
* @param longitude
*/
public void queryAddressByLocation(GeoPoint p){
//GeoPoint geoGPSLocation = new GeoPoint((int)(m_CurrentLocation.getLatitude()*1000000), (int)(m_CurrentLocation.getLongitude()*1000000));
//Android中提供了一个叫ZoomControls的控件对地图来进行放大和缩小处理。
mapView.displayZoomControls(true);//显示地图缩放的按钮
mapController.animateTo(p);//带动画移到p点
mapController.setZoom(7);
}
/**
* 这里需要一个名叫isRouteDisplayed()的方法,这个方法是必须的。用来获取地图API密匙,一旦获得就会传给上边提到的apiKey这个变量。
*/
@Override
protected boolean isRouteDisplayed() {
return false;
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<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="0S3Q4ZaVtVDhibBF6eIGl30D9JDmXVdvP4sQvnQ"
/>
</LinearLayout>
</LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.easyway.android.google"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
<uses-library android:name="com.google.android.maps" />
<activity android:name=".AndroidGoogleMapActivity"
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>