`
runfeel
  • 浏览: 936016 次
文章分类
社区版块
存档分类
最新评论

Android Google Maps 完整实例分析

 
阅读更多
第五部分 Google地图
本例实现了一个移动版的个人地图。通够MapView来浏览地图程序和使用Location来实现定位功能。
res.layout.main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<view class="com.google.android.maps.MapView" //在地图开发中只需要一个MapView来显示地图即可,然后加入一些功能菜单,使应用程序更加完美。
在Android中有3种地图模式,所以需要设置一个菜单来切换地图的模式。也可以设置一些城市名字来供用户
选择,如果没有自己要选择的城市,可以设置一个拱用户输入城市名字的输入框。
android:id="@+id/MapView01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="0dYpmIXGIdwiVm-HEpzuUW2fjNYsFQ9EvYir1sg"
/>
</LinearLayout>

res.layout.dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:gravity="center_horizontal"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/TextView01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/EditText01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:selectAllOnFocus="true"
android:scrollHorizontally="true"/>
</LinearLayout>

package com.yarin.android.MobileMap;

public class ConstData{
public static final double[][] cityCode ={
{39.930000,116.279998},//北京
{31.399999,121.470001},//上海
{39.099998,117.169998},//天津
{29.520000,106.480003},//重庆
{39.669998,118.150001},//唐山
{38.029998,114.419998},//石家庄
{38.900001,121.629997},//大连
{45.750000,126.769996},//哈尔滨
{20.030000,110.349998},//海口
{43.900001,125.220001},//长春
{28.229999,112.870002},//长沙
{30.670000,104.019996},//成都
{26.079999,119.279998},//福州
{23.129999,113.319999},//广州
{26.579999,106.720001},//贵阳
{30.229999,120.169998},//杭州
{31.870000,117.230003},//合肥
{40.819999,111.680000},//呼和浩特
{36.680000,116.980003},//济南
{25.020000,102.680000},//昆明
{29.657589,911.32050},//拉萨
{36.040000,103.879997},//兰州
{28.600000,115.919998},//南昌
{32.000000,118.800003},//南京
{22.819999,108.349998},//南宁
{36.069999,120.330001},//青岛
{22.549999,114.099998},//深圳
{41.770000,123.430000},//沈阳
{37.779998,112.550003},//太原
{43.779998,87.620002},//乌鲁木齐
{30.620000,114.129997},//武汉
{34.299999,108.930000},//西安
{36.619998,101.769996},//西宁
{24.479999,118.080001},//厦门
{34.279998,117.150001},//徐州
{38.479999,106.220001},//银川
{34.720001,113.650001}//郑州
};
public static final String [] city ={
"北京",//
"上海",//
"天津",//
"重庆",//
"唐山",//
"石家庄",//
"大连",//
"哈尔滨",//
"海口",//
"长春",//
"长沙",//
"成都",//
"福州",//
"广州",//
"贵阳",//
"杭州",//
"合肥",//
"呼和浩特",//
"济南",//
"昆明",//
"拉萨",//
"兰州",//
"南昌",//
"南京",//
"南宁",//
"青岛",//
"深圳",//
"沈阳",//
"太原",//
"乌鲁木齐",//
"武汉",//
"西安",//
"西宁",//
"厦门",//
"徐州",//
"银川",//
"郑州"//
};
}

public class LocationOverlay extends Overlay{//在定位后显示出当前地点的地址以及一个标示,需要使用Overlay来绘制地图上的信息。
private Location mLocation;
private MobileMap mMobileMap;
private String mAddresses;
public LocationOverlay(MobileMap mobileMap){
mMobileMap = mobileMap;
}
public void setLocation(Location location){
mLocation = location;
mAddresses = getAddresses();
}
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when){//要在MapView上绘制信息,需要重写Overlay的Draw方法,绘制方法和一般绘图一样
super.draw(canvas, mapView, shadow);
Paint paint = new Paint();
Point scPoint = new Point();
GeoPoint tmpGeoPoint = new GeoPoint((int)(mLocation.getLatitude()*1E6),(int)(mLocation.getLongitude()*1E6));
mapView.getProjection().toPixels(tmpGeoPoint, scPoint);//通过toPixels方法将经度和纬度的信息转换成屏幕上对象的像素坐标信息。

paint.setStrokeWidth(1);
paint.setARGB(255, 255, 0, 0);
paint.setStyle(Paint.Style.STROKE);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);//消除字体的锯齿效果
paint.setTextSize(16);

Bitmap bmp = BitmapFactory.decodeResource(mMobileMap.getResources(), R.drawable.mark);
canvas.drawBitmap(bmp, scPoint.x-bmp.getWidth()/2, scPoint.y-bmp.getHeight(), paint);
canvas.drawText(mAddresses, scPoint.x-paint.measureText(mAddresses)/2, scPoint.y, paint);
return true;
}
public String getAddresses(){
String addressString="没有找到地址";
Geocoder gc=new Geocoder(mMobileMap,Locale.getDefault());
try{
List<Address> addresses=gc.getFromLocation(mLocation.getLatitude(), mLocation.getLongitude(),1);//在绘制之前需要得到当前地点的地址信息,
Geocoder为我们提供了getFromLocation方法来获得地址等信息。
StringBuilder sb=new StringBuilder();
if(addresses.size()>0){
Address address = addresses.get(0);
sb.append("地址:");
for (int i = 0; i < address.getMaxAddressLineIndex(); i++){
sb.append(address.getAddressLine(i));
}
addressString=sb.toString();
}
}catch(IOException e){
}
return addressString;
}
}

public class MobileMap extends MapActivity{//MapActivity用于浏览地图,定位信息处理以及一些菜单事件的处理,我们程序中定义了一些城市的名字供用户选择,在
选择之后将通过该城市所对应的经度和纬度的数据来进行定位。当用户输入城市名字的时候,可以通过Geocoder.getFromLocationName
方法将名字转换成地址,然后找到最合适的城市进行定位
private MapViewmMapView;
private MapControllermMapController;
private GeocodermGeocoder;
private LocationOverlaymLocationOverlay;
private LocationManager mlocationManager;
private Location mLocation;

private static final intSearch= Menu.FIRST;
private static final intSelectCity= Menu.FIRST + 1;
private static final intViewMode= Menu.FIRST + 2;
private static final intExit= Menu.FIRST + 3;

public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
protected boolean isRouteDisplayed(){
return false;
}
public void init(){
mMapView=(MapView)findViewById(R.id.MapView01);
mMapController=mMapView.getController(); //取得MapController实例,控制地图
mlocationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
mMapView.setEnabled(true);
mMapView.setClickable(true);
mMapView.setTraffic(false);//设置显示模式
mMapView.setSatellite(false);
mMapView.setStreetView(true);
mMapView.setBuiltInZoomControls(true); //设置缩放
mMapController.setZoom(12);//设置地图等级

mLocationOverlay=new LocationOverlay(this);
List<Overlay> overlays=mMapView.getOverlays();
overlays.add(mLocationOverlay);

Criteria criteria =new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE); //经度要求
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(false);
criteria.setPowerRequirement(Criteria.POWER_LOW);

String provider=mlocationManager.getBestProvider(criteria, true);//取得效果最好的criteria
mLocation=mlocationManager.getLastKnownLocation(provider); //得到坐标相关的信息
mGeocoder = new Geocoder(this,Locale.getDefault());
updateLocation(mLocation);
mlocationManager.requestLocationUpdates(provider, 3000, 0,mLocationListener);
}
public void updateLocation(Location location) {//更新定位
if ( location == null ){
return;
}
mLocationOverlay.setLocation(location);
Double geoLat=location.getLatitude()*1E6;
Double geoLng=location.getLongitude()*1E6;
GeoPoint point=new GeoPoint(geoLat.intValue(),geoLng.intValue()); //将其转换为int型
mMapController.animateTo(point); //定位到指定坐标
}
public MapController getMapController(){
return mMapController;
}
private final LocationListener mLocationListener=new LocationListener(){
public void onLocationChanged(Location location){
updateLocation(location);
}
public void onProviderDisabled(String provider){
}
public void onProviderEnabled(String provider){
}
public void onStatusChanged(String provider,int status,Bundle extras){
}
};
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
menu.add(0, Search, Menu.NONE, "搜索地点").setIcon(R.drawable.search);
menu.add(0, SelectCity, Menu.NONE, "选择城市").setIcon(R.drawable.selectcity);
menu.add(0, ViewMode, Menu.NONE, "地图模式").setIcon(R.drawable.viewmode);
menu.add(0, Exit, Menu.NONE, "退出").setIcon(R.drawable.exit);
return true;
}
public boolean onOptionsItemSelected(MenuItem item){
super.onOptionsItemSelected(item);
switch (item.getItemId()){
case Search:
searchCity();
return true;
case SelectCity:
selectCity();
return true;
case ViewMode:
selectViewMode();
return true;
case Exit:
this.finish();
return true;
}
return true;
}
public void selectCity(){ //选择城市
OnClickListener listener = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which){
Double geoLat=ConstData.cityCode[which][0]*1E6;
Double geoLng=ConstData.cityCode[which][1]*1E6;

mLocation.setLatitude(ConstData.cityCode[which][0]);
mLocation.setLongitude(ConstData.cityCode[which][1]);
mLocationOverlay.setLocation(mLocation);
GeoPoint point=new GeoPoint(geoLat.intValue(),geoLng.intValue());
mMapController.animateTo(point);//定位到指定坐标
}
};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, ConstData.city);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
new AlertDialog.Builder(MobileMap.this)
.setTitle("请选择城市")
.setAdapter(adapter, listener)
.show();
}
public void selectViewMode(){ //选择地图模式
OnClickListener listener = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which){
switch ( which ){
case 0:
mMapView.setTraffic(false);
mMapView.setSatellite(false);
mMapView.setStreetView(true);
break;
case 1:
mMapView.setSatellite(false);
mMapView.setStreetView(false);
mMapView.setTraffic(true);
break;
case 2:
mMapView.setStreetView(false);
mMapView.setTraffic(false);
mMapView.setSatellite(true);
break;
}
}
};
String[] menu={"街景模式","交通流量","卫星地图"};
new AlertDialog.Builder(MobileMap.this)
.setTitle("请选择地图模式")
.setItems(menu, listener)
.show();
}
public void searchCity(){ //搜索城市
//自定义一个带输入的对话框由TextView和EditText构成
final LayoutInflater factory = LayoutInflater.from(MobileMap.this);
final View dialogview = factory.inflate(R.layout.dialog, null);
((TextView) dialogview.findViewById(R.id.TextView01)).setText("搜索地图");//设置TextView的提示信息
((EditText) dialogview.findViewById(R.id.EditText01)).setText("请输入要查找的地址...");//设置EditText输入框初始值
Builder builder = new Builder(MobileMap.this);
builder.setTitle("请输入地名");
builder.setView(dialogview);
builder.setPositiveButton(android.R.string.ok,new AlertDialog.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String value = ((EditText) dialogview.findViewById(R.id.EditText01)).getText().toString().trim();//点击确定之后
if ( value != "" ){
searchName(value);
}
}
});
builder.setNegativeButton(android.R.string.cancel,new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
dialog.cancel();
}
});
builder.show();
}
public void searchName(String nameStr){
try{
List<Address> addresses = mGeocoder.getFromLocationName(nameStr, 1);
if (addresses.size() != 0){
Address address = addresses.get(0);
GeoPoint geoPoint = new GeoPoint((int) (address.getLatitude() * 1E6), (int) (address.getLongitude() * 1E6));
mLocation.setLatitude(address.getLatitude());
mLocation.setLongitude(address.getLongitude());
mLocationOverlay.setLocation(mLocation);
mMapController.animateTo(geoPoint);
}
}
catch (IOException e){}
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yarin.android.MobileMap"
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=".MobileMap"
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>//因为使用了com.google.android.maps所以需要声明权限。如果要发布应用程序需要申请Google的API Key
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-sdk android:minSdkVersion="5" />
</manifest>

分享到:
评论

相关推荐

    Android开发10个实例源码

    6. **地图集成**:Google Maps API是Android开发中常见的功能,实例可能包含如何在应用中显示地图、定位用户位置、添加标记以及实现路线规划。 7. **权限管理**:随着Android系统对用户隐私保护的加强,运行时权限...

    7个经典Android应用程序实例源代码

    在Android开发领域,掌握经典应用实例的源代码分析对于提升开发者技能至关重要。这些实例源代码提供了宝贵的实践经验和学习素材,帮助我们深入理解Android应用程序的设计原理和实现方式。在这个压缩包中,包含了七个...

    Google-Maps-2018-displaying-a-google-map-end_map_else82j_android

    "Google-Maps-2018-displaying-a-google-map-end_map_else82j_android"这个标题和描述提示我们,这是一个关于2018年时如何在Android Studio项目中实现Google Maps展示的教程或代码示例。下面我们将深入探讨相关的...

    Android创意实例详解书籍源码

    通过分析这些实例,开发者可以学习到如何利用Android的Canvas、Animation、GestureDetector等类来创建独特的用户界面。 再者,源码中可能涉及到数据存储和网络通信。Android提供了SQLite数据库用于本地数据管理,而...

    轨迹记录 android google map 应用

    本实例,"轨迹记录 android google map 应用",是针对Android开发初学者的一个实战项目,它展示了如何在Android设备上实现轨迹记录功能,结合Google Maps展示行走或移动的路径。这个应用对于户外活动、运动健身或者...

    Android核心技术与实例详解 课件PPT

    《Android核心技术与实例详解》是一份全面而深入的Android学习资料,主要涵盖了Android开发中的核心技术和实战案例。通过这份课件PPT,开发者可以系统地理解Android应用开发的关键点,并通过实例来提升自己的技能。 ...

    Android使用Google Map API创建的一个根据经纬度定位的程序二

    在Android开发中,集成Google Maps API是一个常见的需求,它允许开发者在应用中嵌入地图功能,比如定位...同时,对于初学者来说,这样的实例也是一个很好的学习资源,有助于理解和掌握Android与Google Maps API的集成。

    android编程典型实例与项目开发源码

    - Maps API:学习如何在Android应用中集成Google地图,显示地图、标注、路线规划等。 **第10章 手机多媒体服务功能** - MediaPlayer:使用MediaPlayer播放音频和视频。 - Camera API:理解如何调用摄像头,捕获图片...

    Android核心技术与实例详解.pdf

    ### Android核心技术与实例详解 #### 一、Android概述 Android 是一个基于 Linux 内核的开源移动操作系统,由 Google 公司领导开发。它不仅包括操作系统本身,还包含了一个核心的应用程序框架,允许开发者利用其...

    Google Android开发入门与实战(含代码,目前最完整最清晰的一整套)

    该教程包含了丰富的实例代码,确保读者能够通过实践理解理论知识,从而快速掌握Android应用开发。 首先,Android是由Google主导的开源操作系统,广泛应用于智能手机、平板电脑以及智能电视等设备。Android开发主要...

    Android开发实例:gogol地图 源码

    这个实例中的源码可能涵盖了上述所有步骤,通过分析源码,开发者可以更深入地理解如何在Android应用中集成和定制Google Maps功能。同时,也可以学习到如何处理API请求、错误处理以及如何与其他组件(如定位服务)...

    Android 初学中阶高阶书籍_集合打包2

    段,Android 图像处理篇,Android_CTS测试研,GoogleMaps基础开发教程,Android_GPS架构分析,android_JNI编程_一些技 巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文...

    Android 初学中阶高阶书籍_集合打包3

    段,Android 图像处理篇,Android_CTS测试研,GoogleMaps基础开发教程,Android_GPS架构分析,android_JNI编程_一些技 巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文...

    android开发实例大全王东华

    12. **地图与定位服务**:Google Maps API的集成,实现地图显示、定位、路线规划等功能。 13. **权限管理**:Android 6.0及以上版本的运行时权限管理,使用SelfPermission进行权限请求。 14. **通知与推送**:...

    Android 培训示例大全--22个单项功能实例源码

    除此之外,还有一些高级功能的实现,比如权限管理(Android运行时权限),通知推送,多媒体处理(音频、视频播放),GPS定位,地图API(如Google Maps)的集成,传感器交互,动画效果等。这些实例将帮助开发者理解...

    Android经典项目案例开发实战宝典实例源文件 下)

    在本资源中,"Android经典项目案例开发实战宝典实例源文件(下)",包含的是13到22个Android应用开发的经典案例,这些案例是深入理解和掌握Android开发技术的重要资源。每个案例都提供了完整的源代码,有助于开发者...

    50款Android studio项目源码.zip

    5. **定位与地图服务**:利用Google Maps API实现地图功能,以及GPS定位服务,有助于开发者掌握位置服务的实现。 6. **通知与服务**:Android服务(Service)和通知(Notification)的使用,是后台运行任务和与用户...

    《Android视频教程》第三季源代码

    - `googlemaps01` 至 `googlemaps03` 文件包含使用Google Maps SDK for Android开发地图应用的代码。Google Maps API允许开发者在Android应用中集成交互式地图,添加标记、信息窗口、路径绘制等功能。 - `google...

    android fragment 介绍与实例

    在实际开发中,Fragment的使用非常广泛,例如Google推出的Material Design组件中大量使用了Fragment,同时在很多第三方库如Google Play Services、Google Maps等中也广泛应用了Fragment。 对于初学者而言,理解和...

    AndroidGPS定位源码

    综上所述,这份源码实例涵盖了Android应用中实现GPS定位的基本流程,结合Google Maps服务,可为用户提供直观的位置展示。通过深入学习和实践,开发者不仅可以掌握基础的定位功能,还能进一步探索如地理围栏、轨迹...

Global site tag (gtag.js) - Google Analytics