使用百度地图(上)

来源:互联网 发布:网络公开课那个好 编辑:程序博客网 时间:2024/06/13 01:04

人生没有理想,生命便只是一堆空架子。


本讲内容:使用百度地图


1、创建应用

创建应用地址:http://lbsyun.baidu.com/apiconsole/key/create


安全码是由数字签名+;+包名组成。数字签名指的是我们打包程序时所用keystore的SHAL指纹,可以在Eclipse中查看。点击导航栏的Window--Preferences--Android--Build.如图显示:


其中78:DA:7D:EB:50:6D:04:4A:C1:E3:EC:29:B8:D3:AF:19:D2:AD:D2:7C就是我们所需要的SHAL指纹,包名是指你新建的程序的包名。譬如:安全码:78:DA:7D:EB:50:6D:04:4A:C1:E3:EC:29:B8:D3:AF:19:D2:AD:D2:7C;com.example.baidumaptest


创建应用成功,如图显示


其中dhmiAXZK4n8CncsmgEneuaiQ就是申请到的APIKey,有了它就可以进行后续的地图开发了。


2、下载百度地图Android版的SDK

下载地址:http://developer.baidu.com/map/index.php?title=androidsdk/sdkandev-download


示例一:



1、导入jar包

然后在工程属性->Java Build Path->Libraries中选择“Add External JARs”,选定baidumapapi_vX_X_X.jar,确定后返回,您就可以正常使用百度地图SDK为您提供的全部功能了。

注意:armeabi目录是专门用于存放so文件的地方,so文件是用C/C++语言进行编写的,然后再用NDK编译出来的,而上面.so文件已经由百度帮我们编译好了,因此直接放到armeabi目录下就可以使用了。


注意:有时会可能jar包无导入情况。在libs目录上点右键,选Bulid path  –> Use as source folder。


下面是res/layout/activity_main.xml 布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <com.baidu.mapapi.map.MapView        android:id="@+id/bmapView"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:clickable="true" /></RelativeLayout>
这个MapView是由百度提供的自定义控件,所以在使用它需要将完整的包名加上。


下面是MainActivity.java主界面文件:

public class MainActivity extends Activity {private MapView mMapView=null;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//在使用SDK各组件之前初始化context信息,传入ApplicationContext                  //注意该方法要再setContentView方法之前实现SDKInitializer.initialize(getApplicationContext());  setContentView(R.layout.activity_main);initView();}private void initView() {mMapView = (MapView) findViewById(R.id.bmapView);}protected void onResume() {super.onResume();//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理                  mMapView.onResume();}protected void onPause() {super.onPause();//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理                  mMapView.onPause();  }protected void onDestroy() {super.onDestroy();//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理                  mMapView.onDestroy();  }}


在AndroidMainfest.xml文件

1、在application中添加开发密钥

<application>      <meta-data          android:name="com.baidu.lbsapi.API_KEY"          android:value="开发者 key" />  </application>

2、添加所需权限

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />    <uses-permission android:name="android.permission.USE_CREDENTIALS" />    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.BROADCAST_STICKY" />    <uses-permission android:name="android.permission.WRITE_SETTINGS" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />



示例二:地图类型

1、百度地图Android SDK为您提供了两种类型的地图资源(普通矢量地图和卫星图),默认是普通矢量地图,开发者可以利用BaiduMap中的mapType()方法来设置地图类型。核心代码如下:

mMapView = (MapView) findViewById(R.id.bmapView);  mBaiduMap = mMapView.getMap();  //普通地图  mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);  //卫星地图  mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);

注意:百度地图提供了一个MapStatusUpdateFactory类来设置地图的缩放级别,取值范围是3-19,级别越高,地图显示的信息就越精细。
MapStatusUpdate msu=MapStatusUpdateFactory.zoomTo(15);//设置缩放级别mBaiduMap.setMapStatus(msu);


2、实时交通图

//开启交通图   mBaiduMap.setTrafficEnabled(true);


 

下面是res/menu/main文件

<menu xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools" >    <item        android:id="@+id/id_map_common"        android:title="普通地图"        app:showAsAction="never"/>    <item        android:id="@+id/id_map_site"        android:title="卫星地图"        app:showAsAction="never"/>    <item        android:id="@+id/id_map_traffic"        android:title="实时交通(off)"        app:showAsAction="never"/></menu>

下面是MainActivity.java主界面文件:

public class MainActivity extends Activity {private MapView mMapView;private BaiduMap mBaiduMap;private LocationManager locationManager;private String provider;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//在使用SDK各组件之前初始化context信息,传入ApplicationContext                  //注意该方法要再setContentView方法之前实现SDKInitializer.initialize(getApplicationContext());  setContentView(R.layout.activity_main);initView();}private void initView() {mMapView = (MapView) findViewById(R.id.bmapView);mBaiduMap=mMapView.getMap();MapStatusUpdate msu=MapStatusUpdateFactory.zoomTo(15);//设置缩放级别mBaiduMap.setMapStatus(msu);}public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.id_map_common://默认是普通地图mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);break;case R.id.id_map_site://卫星地图mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);break;case R.id.id_map_traffic://实时交通(红线代表阻塞,绿线体表畅通)if(mBaiduMap.isTrafficEnabled()){mBaiduMap.setTrafficEnabled(false);item.setTitle("实时交通(off)");}else{mBaiduMap.setTrafficEnabled(true);item.setTitle("实时交通(on)");}break;}return super.onOptionsItemSelected(item);}………………}

示例三:定位功能

1、LocationClient定位SDK的核心类,LocationClient类必须在主线程中声明。需要Context类型的参数。Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的context,我们调用registerLocationListener(BDLocationListener)方法来注册定位监听接口。

2、BDLocationListener定位接口,一般新建一个类实现它,并重写onReceiveLocation()方法。

3、LocationClientOption 类用来设置定位SDK的定位方式。


 

导入百度地图定位SDK:liblocSDK5.so,如下图



在菜单添加一个定位到我的位置按钮:

<item        android:id="@+id/id_map_location"        android:title="我的位置"        app:showAsAction="never"/>

下面是MainActivity.java主界面文件:
public class MainActivity extends Activity {private MapView mMapView;private BaiduMap mBaiduMap;private Context context;//定位相关private LocationClient mLocationClient;private MyLocationListener mLocationListener;private boolean isFirstIn = true;//第一次启动时定位到设置当前位置private double mLatitude;private double mLongtitude;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//在使用SDK各组件之前初始化context信息,传入ApplicationContext                  //注意该方法要再setContentView方法之前实现SDKInitializer.initialize(getApplicationContext());  setContentView(R.layout.activity_main);this.context=this;initView();initLocation();}private void initView() {mMapView = (MapView) findViewById(R.id.bmapView);mBaiduMap=mMapView.getMap();MapStatusUpdate msu=MapStatusUpdateFactory.zoomTo(15);//设置缩放级别mBaiduMap.setMapStatus(msu);}/** * 初始化定位 */private void initLocation(){mLocationClient=new LocationClient(getApplicationContext());mLocationListener=new MyLocationListener();mLocationClient.registerLocationListener(mLocationListener);LocationClientOption option=new LocationClientOption();option.setCoorType("bd09ll");// 设置返回的坐标类型(设置返回的定位结果是百度经纬度,默认值gcj02)option.setIsNeedAddress(true);//返回的定位结果包含地址信息option.setOpenGps(true);//是否打开GPS option.setScanSpan(3000);//设置发起定位请求的间隔时间为3000ms  onReceiveLocation方法每隔3秒执行一次mLocationClient.setLocOption(option);}public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.id_map_common://默认是普通地图mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);break;case R.id.id_map_site://卫星地图mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);break;case R.id.id_map_traffic://实时交通(红线代表阻塞,绿线体表畅通)if(mBaiduMap.isTrafficEnabled()){mBaiduMap.setTrafficEnabled(false);item.setTitle("实时交通(off)");}else{mBaiduMap.setTrafficEnabled(true);item.setTitle("实时交通(on)");}break;case R.id.id_map_location:centerToMyLocation();break;}return super.onOptionsItemSelected(item);}/** *定位接口  *onReceiveLocation():接收异步返回的定位结果 */private class MyLocationListener implements BDLocationListener{public void onReceiveLocation(BDLocation location) {if(location==null){return;}//当参数比较多时,习惯在类里面建立一个Builder内部类来初始化参数MyLocationData data=new MyLocationData.Builder()//.accuracy(location.getRadius())//.latitude(location.getLatitude())//.longitude(location.getLongitude())//.build();mBaiduMap.setMyLocationData(data);// 更新经纬度mLatitude = location.getLatitude();mLongtitude = location.getLongitude();//使每次发起定位请求不会执行if(isFirstIn){centerToMyLocation();isFirstIn=false;Toast.makeText(context, location.getAddrStr(),Toast.LENGTH_LONG).show();}}}/** * 定位到我的位置 */private void centerToMyLocation(){LatLng latLng = new LatLng(mLatitude, mLongtitude);MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);mBaiduMap.animateMapStatus(msu);}protected void onStart() {super.onStart();// 开启定位mBaiduMap.setMyLocationEnabled(true);// 开启定位图层 if(!mLocationClient.isStarted()){mLocationClient.start();//启动}}protected void onStop() {super.onStop();// 停止定位mBaiduMap.setMyLocationEnabled(false);mLocationClient.stop();}protected void onResume() {super.onResume();//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理          mMapView.onResume();}protected void onPause() {super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理          mMapView.onPause();  }protected void onDestroy() {super.onDestroy();//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理          mMapView.onDestroy();  }}


在AndroidMainfest.xml文件:(不然onReceiveLocation方法只会启动一次)

        <service            android:name="com.baidu.location.f"            android:enabled="true"            android:process=":remote" >        </service>





0 0
原创粉丝点击