android 手机地图

Android google map的应用有:

1.我的位置:在地图上显示你的当前位置(通常在1000米范围内)。即使没有GPS,你也可以确定自己的位置。Google手机地图还支持内在GPS,也可以链接到蓝牙GPS传感器,以便更加准确定位用户的位置。“我的位置”的功能通过识别你附近无线发射塔的信息广播而确定你的位置的。

2.地图和卫星视图:Google手机地图可以向你提供所查地区的地图和卫星视图,器界面的使用感觉与你在台式机上相同。可沿着其中一个方向滚动,以查看地图上更多内容,或可以使用快捷键进行缩放。

3.商户列表:借助Google的本地搜索,可以按名称(如“星巴克”)或类型(如“咖啡”——搜索商家,查看商店的营业时间和评分,然后,只需点击一下即可拨通感兴趣的商家的电话。有了“我的位置”功能,甚至都不用输入当前位置即可方便的找到附近的商家。

4.驾车路线:可以很方便的获得驾车路线,其中会很清楚地标识每次转弯。有了“我的位置”功能,甚至都不需要输入出发点。

5.公交换乘:查看公交和地铁线路,确定转车路线,制定你在全球80个城市的出行计划。

6.路况信息:Google地图上的公路会根据实时的路况数据,以绿色,黄色或红色显示。

7.收藏夹:为你常去的地方加上书签,以便能在地图上非常方便地返回到这些地方。
Android Gps 定位功能:

全球定位系统(Global Positioning System,GPS),重要的功能类:

LocationManager:本类提供访问定位服务的功能,也提供获取最佳定位提供者的功能。另外,临近警报功能也可以借助该类来实现。

LocationProvide:该类是定位提供者的抽象类。定位提供者具备周期性报告设备地理位置的功能。LocationListener:提供地位信息发生改变时的回调功能。必须事先在定位管理器中注册监听器对象。

Criteria:该类使得应用能够通过在LocationProvider中设置的属性来选择合适的定位提供者。

Geocoder:用处理地理编码和反向地理编码的类。地理编码是指将地址或者其他描述转变为经度和纬度,反向地理编码是将经度和纬度转变为地址或描述语言,其中包含了两个构造 函数,需要传入经度和纬度的坐标。getFromLocation方法可以得到一组关于地址的数组。

LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

注册:locationManager.requestLocationUpdate(LocationManager.GPS_PROVIDER,1000,0,locationManager);其中第一个参数是设置服务提供者,可以是network也可以是gps,第二个参数是定时单位为毫秒,最后一个参数locationManager,用于监听位置变化和gps的变化:

onLocationChanged(Location location):当坐标改变时触发次函数,如果Provider传进相同的坐标,它就不会触发,获取经纬度就从这里获取。

onProviderDisabled(String provider):Provider GPS被关闭。

onProviderEnabled(Sting provider):Provider GPS被打开。

onStatusChanged(String provider, int status, Bundle extras):Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数。

Android Google Map步骤:一、申请google Maps API key要有一个Google账号或Gmail的账号。

1.找到你的debug.keystore文件在Eclipse工具下,选择windows-->Preference-->Android-->Build,debug keystore的值便是debug.keystore的路径了。

2.首先cmd命令行进入执行命令:Cd C:\Documents andSettings\Administrator\.androidkeytool -list -keystore debug.keystore,默认的密码是android,输入回车可取得MD5值。


3.申请Android Map 的API Key.打开火狐浏览器,输入网址:http://code.google.com/android/maps-api-signup.html,填入你的认证指纹(MD5)即可获得apiKey了,结果显示如下:

二.Google Map API的使用应用com.google.android.map包,重要的几个类有:

1.MapActivity:这个类是用于显示Google Map的Activity类,它需要连接底层网络。MapActivity是一个抽象类,任何想要显示MapView的activity都需要派生自MapActivity,并且在其派生类的onCreate()中,都要创建一个MapView实例。

2.MapView:MapView是用于显示地图的View组件。它派生自android.view.ViewGroup。它必须和MapActivity配合使用,而且只能被MapActivity创建,这是因为MapView需要通过后台的线程来连接网络或者文件系统,而这些线程需要有MapActivity来管理。

3.MapController:MapController用于控制地图的移动、缩放等。

4.OverLay:这是一个可显示于地图之上的可绘制的对象。

5.GeoPoint:这是一个包含经纬度位置的对象。

三.实例开发

1.创建工程,注意SDK旋转为"Goolge APIs”

2.修改AndroidManifest.xml文件在application节点中添加<uses-libraryandroid:name="com.google.android.maps" />

添加权限<uses-permissionandroid:name="android.permission.INTERNET"/>

<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION" />可能还需要添加其他权限。例如:

AndroidManifest.xml <?xml version="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.feige"
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" />
<activityandroid:name=".FeigeMap"
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-permissionandroid:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-sdk android:minSdkVersion="7" />
</manifest>

3.创建MapViewmain.xml <?xml version="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns: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/mv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:apiKey="自己上面申请的密钥"/>
</RelativeLayout> 当然,可以在程序中通过如下代码来创建MapView:MapView map = new MapView( this,"(android maps api key)");

4.实现MapActivitymMapView.setTraffic(true); //设置为交通模式

mMapView.setSatellite(true); //设置为卫星模式

mMapView.setStreetView(true); //设置为街景模式通过

setBuiltZoomControls方法设置地图是否支持缩放。

5.MapController的使用如果需要设置地图显示的地点以及放大倍数等,就需要使用MapController来控制地图。可以通过如下代码获得MapController对象:mMapController =mMapView.getController(); 要定位地点,需要构造一个GeoPoint来表示地点的经纬度,然后使用animateTo方法将地图定位到指定的GeoPoint上,代码如下:mGeoPoint = new GeoPoint((int) (31.203713* 1E6), (int) (121.553782 * 1E6));
mMapController.animateTo(mGeoPoint);

6.Ovelay的使用如果需要在地图上标注一些图标文字等信息,就需要使用Overlay。这里我们首先要将地图上的经度和纬度转换成屏幕上的实际坐标,才能将信息绘制上去。Map API中提供了Projection.toPixels(GeoPoint in,GeoPoint out)方法,可以将经度和纬度转换成屏幕上的坐标。首先需要实现OverLay中的draw方法才能在地图上绘制信息,代码如下:

public class ArrowOverLay extends Overlay{

Bitmap bmpArrow; GeoPoint gp; publicArrowOverLay(Bitmap bmpArrow, GeoPoint gp) { super(); this.bmpArrow =bmpArrow; this.gp = gp; } @Override public void draw(Canvascanvas, MapView mapView, boolean shadow) { // TODOAuto-generated method stub super.draw(canvas,mapView, shadow); if (!shadow) { Projection proj = mapView.getProjection(); Point p = newPoint(); //将地理坐标转化为屏幕坐标 proj.toPixels(gp, p); canvas.drawBitmap(bmpArrow, p.x - bmpArrow.getWidth() / 2, p.y - bmpArrow.getHeight(), null); } }} LocationListener listener = new LocationListener(){ @Override //Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数 public voidonStatusChanged(String provider, int status, Bundle extras) { } @Override //Provider被enable时触发此函数,比如GPS被打开 public voidonProviderEnabled(String provider) { } @Override //Provider被disable时触发此函数,比如GPS被关闭 public voidonProviderDisabled(String provider) { } @Override //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发 public voidonLocationChanged(Location location) { openGps(); try{ update(location); } catch(IOException e) { // TODOAuto-generated catch block e.printStackTrace(); } } }; public voidupdate(Location lt) throws IOException { if (lt != null) { try{ doublelatitude = lt.getLatitude(); doublelongitude = lt.getLongitude(); updateMapView(latitude, longitude) } catch(Exception e) { } } } //更新地图 public voidupdateMapView(doubledLat, doubledLong) { GeoPoint gp = newGeoPoint((int)(dLat* 1E6), (int)(dLong* 1E6)); //显示缩放按钮 mv.displayZoomControls(true); //将地图移动到指定的地理位置 controller.animateTo(gp); List<Overlay> li = mv.getOverlays(); li.add(new ArrowOverLay(bmpArrow, gp)); }

7运行程序




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.需要在 http://developer.baidu.com/ 注册开发者(个人或公司)账号 2.需要申请Key 打开网址 http://developer.baidu.com/map/index.php 点击 创建应用,跟流程创建应用app 3.点击相关下载->一键下载 4.调用百度地图的APP 需要在 AndroidManifest.xml 添加 <application android:name="baidumapsdk.demo.DemoApplication" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > 这里需要添加key,创建应用后,会有这个key <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="6t2yuIFylnRG7ECj1xHYuelY" /> ..... package com.obtk.mapdemo; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BaiduMapOptions; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.search.core.SearchResult; import com.baidu.mapapi.search.geocode.GeoCodeResult; import com.baidu.mapapi.search.geocode.GeoCoder; import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener; import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption; import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.RelativeLayout; import android.widget.Toast; import android.app.Activity; import com.obtk.mapdemo.R; public class MapApiDemoActivity extends Activity implements OnGetGeoCoderResultListener { private MapView mMapView = null; private BaiduMap mBaiduMap = null; private GeoCoder mSearch = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // SDK初始化 SDKInitializer.initialize(getApplicationContext()); //当前视图 setContentView(R.layout.activity_map_api_demo); //创建地图对象 init(); final Button btn_location = (Button) findViewById(R.id.btn_location); btn_location.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub getLocation(); btn_location.setEnabled(false); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_map_api_demo, menu); return true; } /** * 初始化方法 */ private void init() { //mMapView = (MapView) findViewById(R.id.bmapview); mMapView = new MapView(this, new BaiduMapOptions()); mBaiduMap = mMapView.getMap(); /**添加一个对象*/ RelativeLayout rlly_map = (RelativeLayout)findViewById(R.id.rlly_map); rlly_map.addView(mMapView); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); //初始化搜索模块,注册事件监听 mSearch = GeoCoder.newInstance(); mSearch.setOnGetGeoCodeResultListener(this); } @Override protected void onResume() { super.onResume(); mMapView.onResume(); } @Override protected void onPause() { super.onPause(); mMapView.onPause(); } @Override protected void onDestroy() { // 退出时销毁定位 mLocClient.stop(); // 关闭定位图层 mBaiduMap.setMyLocationEnabled(false); mMapView.onDestroy(); mMapView = null; super.onDestroy(); } // 定位相关 LocationClient mLocClient; public MyLocationListenner myListener = new MyLocationListenner(); private LocationMode mCurrentMode; private boolean isFirstLoc = true; /** * 定位SDK监听函数 */ public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { // map view 销毁后不在处理新接收的位置 if (location == null || mMapView == null) return; MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) //此处设置开发者获取到的方向信息,顺时针0-360 .direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); mBaiduMap.animateMapStatus(u); } String addr = location.getAddrStr(); if (addr != null) { Log.i("Test", addr); } else { Log.i("Test","error"); } double longitude = location.getLongitude(); double latitude = location.getLatitude(); if (longitude > 0 && latitude > 0) { Log.i("Test",String.format("纬度:%f 经度:%f", latitude,longitude)); LatLng ptCenter = new LatLng(latitude,longitude); // 反Geo搜索 mSearch.reverseGeoCode(new ReverseGeoCodeOption() .location(ptCenter)); } //停止定位 mLocClient.stop(); } public void onReceivePoi(BDLocation poiLocation) { } } private void getLocation() { // 定位初始化 mLocClient = new LocationClient(this); mLocClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);//打开gps option.setCoorType("bd09ll"); //设置坐标类型 option.setScanSpan(5000); //定位时间间隔 mLocClient.setLocOption(option); mLocClient.start(); } @Override public void onGetGeoCodeResult(GeoCodeResult arg0) { // TODO Auto-generated method stub } @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) { // TODO Auto-generated method stub if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(MapApiDemoActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG) .show(); return; } mBaiduMap.clear(); // mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation()) // .icon(BitmapDescriptorFactory // .fromResource(R.drawable.icon_marka))); mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result .getLocation())); Toast.makeText(MapApiDemoActivity.this, result.getAddress(), Toast.LENGTH_LONG).show(); String province = result.getAddressDetail().province; String city = result.getAddressDetail().city; if (province != null && city != null) { } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值