目标效果:
菜单中设置几种模式,点击可查看不同的地图形式,这里随便截几张图。
1.首先要去百度地图网站 http://lbsyun.baidu.com/
2.注册账号后,点击开发->Android地图SDK->获取密钥,进入后显示如下页面。
3.创建应用
4.打开eclipse,选择Window->Preferences->Android->Build,获取SHA1
5.提交后回到上一个Android地图SDK页面选择相关下载,再点击自定义下载
6.选择定位功能,基础地图,检索功能,LBS云检索,计算工具后点击开发包,示例代码和类参考根据自己的实际情况进行下载
7.下载完成后解压如图
8.开始创建应用,注意创建时包名
9.创建好后,把刚才下载的libs目录下所有内容复制到项目libs文件夹中。
10.开始编写代码。activity_main.xml页面放入一个map控件。
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" tools:context=".MainActivity" > <com.baidu.mapapi.map.MapView android:id="@+id/mv_map" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </RelativeLayout>
11.main.xml作为菜单页面,增加几个模式选择。
main.xml页面:
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/id_map_common" android:orderInCategory="100" android:showAsAction="never" android:title="普通地图"/> <item android:id="@+id/id_map_site" android:orderInCategory="100" android:showAsAction="never" android:title="卫星地图"/> <item android:id="@+id/id_map_traffic" android:orderInCategory="100" android:showAsAction="never" android:title="实时交通(off)"/> <item android:id="@+id/id_map_location" android:orderInCategory="100" android:showAsAction="never" android:title="我的位置"/> <item android:id="@+id/id_map_mode_common" android:orderInCategory="100" android:showAsAction="never" android:title="普通模式"/> <item android:id="@+id/id_map_mode_following" android:orderInCategory="100" android:showAsAction="never" android:title="跟随模式"/> <item android:id="@+id/id_map_mode_compass" android:orderInCategory="100" android:showAsAction="never" android:title="罗盘模式"/> </menu>
12.创建MyOrientationListener.java页面用于在方向改变时进行获取。
MyOrientationListener.java页面:
package com.imooc.baidumap; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; public class MyOrientationListener implements SensorEventListener { private SensorManager mSensorManager; private Context context; private Sensor mSensor;// 传感器 private float lastX; public MyOrientationListener(Context context) { this.context = context; } // 开启监听 @SuppressWarnings("deprecation") public void start() { //获得系统服务 mSensorManager=(SensorManager) context.getSystemService(Context.SENSOR_SERVICE); if(mSensorManager!=null){ //获得方向传感器 mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); } if(mSensor!=null){ mSensorManager.registerListener(this, mSensor,SensorManager.SENSOR_DELAY_UI);//第三个参数为经度 } } // 结束监听 public void stop() { //停止定位 mSensorManager.unregisterListener(this); } // 经度发生改变时 @Override public void onAccuracyChanged(Sensor arg0, int arg1) { } // 纬度发生改变时 @Override public void onSensorChanged(SensorEvent event) { //如果事件返回的类型是方向传感器 if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){ float x=event.values[SensorManager.DATA_X]; //如果变化大于一度 if(Math.abs(x-lastX)>1.0){ //通知主界面进行回掉 if(mOnOrientationListener!=null){ mOnOrientationListener.onOrientationChanged(x); } } lastX=x; } } private OnOrientationListener mOnOrientationListener; public void setmOnOrientationListener( OnOrientationListener mOnOrientationListener) { this.mOnOrientationListener = mOnOrientationListener; } //回掉接口 public interface OnOrientationListener{ void onOrientationChanged(float x); } }
13.主页面MainActivity.java页面进行模式更改以及定位等。
MainActivity.java页面:
package com.imooc.baidumap; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.location.LocationClientOption.LocationMode; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MyLocationConfiguration; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationConfiguration; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.model.LatLng; import com.imooc.baidumap.MyOrientationListener.OnOrientationListener; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.MenuItem; import android.view.Window; public class MainActivity extends Activity { private MapView mv_map; private BaiduMap baiduMap; // 定位相关 private LocationClient mLocationClient; private MyLocationListener mLocationListener; private boolean isFirstIn = true; private double mLatitude; // 记录最新经纬度 private double mLongtitude; // 自定义定位图标 private BitmapDescriptor mIconLocation; private MyOrientationListener mOrientationListener; private float mCurrentX; // 模式变量 private com.baidu.mapapi.map.MyLocationConfiguration.LocationMode mLocationMode; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 在使用SDK各组件之前初始化context信息,传入ApplicationContext // 注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); // 初始化控件 init(); // 初始化定位 initLocation(); } // 初始化控件 private void init() { mv_map = (MapView) findViewById(R.id.mv_map); baiduMap = mv_map.getMap(); MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);// 设置地图放大比例 baiduMap.setMapStatus(msu); } @Override protected void onStart() { super.onStart(); baiduMap.setMyLocationEnabled(true); if (!mLocationClient.isStarted()) { // 开启定位 mLocationClient.start(); // 开启方向传感器 mOrientationListener.start(); } } @Override protected void onStop() { super.onStop(); baiduMap.setMyLocationEnabled(false); // 停止定位 mLocationClient.stop(); // 停止方向传感器 mOrientationListener.stop(); } @Override protected void onResume() { super.onResume(); // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mv_map.onResume(); } @Override protected void onPause() { super.onPause(); // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mv_map.onPause(); } @Override protected void onDestroy() { super.onDestroy(); // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mv_map.onDestroy(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); } // 点击菜单进行切换地图 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.id_map_common: // 普通地图 baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); break; case R.id.id_map_site: // 卫星地图 baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); break; case R.id.id_map_traffic: // 实时交通 if (baiduMap.isTrafficEnabled()) { baiduMap.setTrafficEnabled(false); item.setTitle("实时交通(off)"); } else { baiduMap.setTrafficEnabled(true); item.setTitle("实时交通(on)"); } break; case R.id.id_map_location: centerToMyLocat(); break; case R.id.id_map_mode_common: mLocationMode = com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.NORMAL; break; case R.id.id_map_mode_following: mLocationMode = com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.FOLLOWING; break; case R.id.id_map_mode_compass: mLocationMode = com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.COMPASS; break; default: break; } return super.onOptionsItemSelected(item); } // 定位到我的位置 private void centerToMyLocat() { LatLng latLng = new LatLng(mLatitude, mLongtitude); MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng); baiduMap.animateMapStatus(msu); } private class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { MyLocationData data = new MyLocationData.Builder()// .direction(mCurrentX)// .accuracy(location.getRadius())// .latitude(location.getLatitude())// .longitude(location.getLongitude())// .build(); baiduMap.setMyLocationData(data); // 更新位置 mLatitude = location.getLatitude(); mLongtitude = location.getLongitude(); // 判断是否第一次进入 if (isFirstIn) { LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng); baiduMap.animateMapStatus(msu); isFirstIn = false; } // 设置自定义图标 MyLocationConfiguration config = new MyLocationConfiguration( mLocationMode, true, mIconLocation); baiduMap.setMyLocationConfigeration(config); } } // 初始化定位 private void initLocation() { mLocationMode = com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.NORMAL; // 默认模式 mLocationClient = new LocationClient(this); mLocationListener = new MyLocationListener(); mLocationClient.registerLocationListener(mLocationListener); LocationClientOption option = new LocationClientOption(); option.setCoorType("bd0911"); option.setIsNeedAddress(true); option.setOpenGps(true); option.setScanSpan(1000);// 每个多少秒进行一次请求 mLocationClient.setLocOption(option); // 初始化图标 mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.arrow); mOrientationListener = new MyOrientationListener(this); mOrientationListener .setmOnOrientationListener(new OnOrientationListener() { @Override public void onOrientationChanged(float x) { mCurrentX = x; } }); } }
14.Androidmanifest.xml页面配置权限及添加AppKey。
Androidmanifest.xml页面:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.imooc.baidumap" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="19" /> <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.WAKE_LOCK" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="3KjZS5ym9TXSm98V7bVjwZTZwAoajsgp" /><!-- 创建应用的AppKey --> <activity android:name="com.imooc.baidumap.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> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > <intent-filter> <action android:name="com.baidu.location.service_v2.2"> </action> </intent-filter> </service> </application> </manifest>
15.程序运行就可以显示目标效果了。
时间: 2024-10-11 02:06:15