首页 > 代码库 > 百度地图----->地图类型、定位模式、实时交通、我的位置、加入覆盖物、覆盖物详情及提示
百度地图----->地图类型、定位模式、实时交通、我的位置、加入覆盖物、覆盖物详情及提示
在百度地图开发平台 http://developer.baidu.com/map/index.php?
以下也是官方的提示:
修正:官方的权限在某些手机上无法成功。为了保险起见,能够用以下的这些权限
開始粘贴项目代码吧 +++++++++天下一大抄。抄来抄去,这里感谢一些hyman大神。
另外drawable里面的一个小文件(无关痛痒。是图像的小处理)
Info(是地图上marker的封装信息类,便于学习,没有从server获取)
MyOrientationListener
另外还有那个menu文件(无关痛痒的)
title=androidsdk
进行创建应用,获取应用的AK,在进行下载BaiduLBS_Android.jar和armeabi--然后放于libs文件夹下。另外获取安全码
Android SDK安全码组成:数字签名+;+包名。(查看具体配置方法),创建应用,提交后,自己主动下发Ak(配置文件里用到)
以下是官方的提示:
第一步:在project里新建libs文件夹。将开发包里的baidumapapi_vX_X_X.jar复制到libs根文件夹下。将libBaiduMapSDK_vX_X_X.so复制到libs\armeabi文件夹下(官网demo里已有这两个文件。假设要集成到自己的project里,就须要自己加入),拷贝完毕后的project文件夹例如以下图所看到的; 1.JPG 第二步:在project属性->Java Build Path->Libraries中选择“Add External JARs”,选定baidumapapi_vX_X_X.jar,确定后返回。 通过以上两步操作后,您就能够正常使用百度地图SDK为您提供的所有功能了。 注意:因为adt插件升级。若您使用Eclipse adt 22的话,须要对开发环境进行对应的设置,方法例如以下: 1. 在Eclipse 中选中project。右键选 Properties->Java Build Path->Order and Export 使 Android Private Libraries处于勾选状态; 2. Project -> clean-> clean all .
以下也是官方的提示:
百度地图SDK为开发人员提供了便捷的显示百度地图数据的接口,通过下面几步操作。就可以在您的应用中使用百度地图数据: 第一步:创建并配置project(详细方法參见project配置部分的介绍); 第二步:在AndroidManifest中加入开发密钥、所需权限等信息; (1)在application中加入开发密钥 <application> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="http://www.mamicode.com/开发人员 key" /> </application> 2)加入所需权限 <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" /> 第三步。在布局xml文件里加入地图控件。 <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> 第四步。在应用程序创建时初始化 SDK引用的Context 全局变量: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); } } 注意:在SDK各功能组件使用之前都须要调用 SDKInitializer.initialize(getApplicationContext());,因此我们建议该方法放在Application的初始化方法中 第五步,创建地图Activity,管理地图生命周期。 public class MainActivity extends Activity { MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息。传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //获取地图控件引用 mMapView = (MapView) findViewById(R.id.bmapView); } @Override protected void onDestroy() { super.onDestroy(); //在activity运行onDestroy时运行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity运行onResume时运行mMapView. onResume ()。实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity运行onPause时运行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); } }
修正:官方的权限在某些手机上无法成功。为了保险起见,能够用以下的这些权限
<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" />***************************************************************************************************项目代码開始*************************************
開始粘贴项目代码吧 +++++++++天下一大抄。抄来抄去,这里感谢一些hyman大神。
。。
先看自己项目的配置文件吧
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.homebaimap" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="18" android:targetSdkVersion="18" /> <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" /> <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="http://www.mamicode.com/h1sIN5FLXGPodE5QCt7VpU7R" /> <activity android:name=".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>
主页面布局
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/id_bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> <RelativeLayout android:id="@+id/id_maker_ly" android:layout_width="match_parent" android:layout_height="220dp" android:layout_alignParentBottom="true" android:background="#cc4e5a6b" android:clickable="true" android:visibility="gone" > <ImageView android:id="@+id/id_info_img" android:layout_width="fill_parent" android:layout_height="150dp" android:layout_marginBottom="10dp" android:layout_marginLeft="12dp" android:layout_marginRight="12dp" android:layout_marginTop="10dp" android:background="@drawable/img_border" android:scaleType="fitXY" android:src="http://www.mamicode.com/@drawable/a01" > </ImageView> <RelativeLayout android:layout_width="fill_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" android:background="@drawable/bg_map_bottom" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="20dp" android:orientation="vertical" > <TextView android:id="@+id/id_info_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="老米家泡馍" android:textColor="#fff5eb" /> <TextView android:id="@+id/id_info_distance" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="距离200米" android:textColor="#fff5eb" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="20dp" android:orientation="horizontal" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/map_zan" android:clickable="true" /> <TextView android:id="@+id/id_info_zan" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="789" android:textColor="#fff5eb" /> </LinearLayout> </RelativeLayout> </RelativeLayout> </RelativeLayout>
另外drawable里面的一个小文件(无关痛痒。是图像的小处理)
img_border.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <stroke android:width="20dp" android:color="#AAFFFFFF" /> <padding android:bottom="2dp" android:left="2dp" android:right="2dp" android:top="2dp" > </padding> </shape>
Info(是地图上marker的封装信息类,便于学习,没有从server获取)
package com.example.homebaimap; import java.io.Serializable; import java.util.ArrayList; import java.util.List; public class Info implements Serializable { private static final long serialVersionUID = -1010711775392052966L; private double latitude; private double longitude; //图片 private int imgId; //名字 private String name; //距离 private String distance; //赞 private int zan; public static List<Info> infos = new ArrayList<Info>(); static { infos.add(new Info(34.242652, 108.971171, R.drawable.a01, "英伦贵族小旅馆", "距离209米", 1456)); infos.add(new Info(34.242952, 108.972171, R.drawable.a02, "沙井国际洗浴会所", "距离897米", 456)); infos.add(new Info(34.242852, 108.973171, R.drawable.a03, "五环服装城", "距离249米", 1456)); infos.add(new Info(34.242152, 108.971971, R.drawable.a04, "老米家泡馍小炒", "距离679米", 1456)); } public Info(double latitude, double longitude, int imgId, String name, String distance, int zan) { this.latitude = latitude; this.longitude = longitude; this.imgId = imgId; this.name = name; this.distance = distance; this.zan = zan; } public double getLatitude() { return latitude; } public void setLatitude(double latitude) { this.latitude = latitude; } public double getLongitude() { return longitude; } public void setLongitude(double longitude) { this.longitude = longitude; } public int getImgId() { return imgId; } public void setImgId(int imgId) { this.imgId = imgId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDistance() { return distance; } public void setDistance(String distance) { this.distance = distance; } public int getZan() { return zan; } public void setZan(int zan) { this.zan = zan; } }
package com.example.homebaimap; import java.util.List; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.graphics.Point; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; 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.BaiduMap.OnMapClickListener; import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.InfoWindow; import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener; import com.baidu.mapapi.map.MapPoi; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.Marker; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.MyLocationConfiguration; import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.model.LatLng; import com.example.homebaimap.MyOrientationListener.OnOrientationListener; public class MainActivity extends Activity { private Context context; // 定位相关 private LocationMode mLocationMode; private LocationClient mLocationClient; private MyLocationListener mLocationListener; private boolean isFirstIn = true; private double mLatitude; private double mLongtitude; // 自己定义定位图标 private BitmapDescriptor mIconLocation; private MyOrientationListener myOrientationListener; private float mCurrentX; // 覆盖物相关 private BitmapDescriptor mMarker; private RelativeLayout mMarkerLy; // 初始化视图控件 private MapView mMapView; private BaiduMap mBaiduMap; private void initView() { mMapView = (MapView) findViewById(R.id.id_bmapView); mBaiduMap = mMapView.getMap(); // 设置地图缩放级别。标尺大概在500米左右 MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f); mBaiduMap.setMapStatus(msu); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); // 在使用SDK各组件之前初始化context信息,传入ApplicationContext // 注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); this.context = this; //初始化控件。而且设置缩放级别 initView(); // 初始化定位 initLocation(); //初始化覆盖物 initMarker(); /** * 点击位置信息,回调方法 */ mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { Bundle extraInfo = marker.getExtraInfo(); //获取携带的信息 Info info = (Info) extraInfo.getSerializable("info"); ImageView iv = (ImageView) mMarkerLy .findViewById(R.id.id_info_img); TextView distance = (TextView) mMarkerLy .findViewById(R.id.id_info_distance); TextView name = (TextView) mMarkerLy .findViewById(R.id.id_info_name); TextView zan = (TextView) mMarkerLy .findViewById(R.id.id_info_zan); iv.setImageResource(info.getImgId()); distance.setText(info.getDistance()); name.setText(info.getName()); zan.setText(info.getZan() + ""); InfoWindow infoWindow; TextView tv = new TextView(context); tv.setBackgroundResource(R.drawable.location_tips); tv.setPadding(30, 20, 30, 50); tv.setText(info.getName()); tv.setTextColor(Color.parseColor("#ffffff")); final LatLng latLng = marker.getPosition(); Point p = mBaiduMap.getProjection().toScreenLocation(latLng); p.y -= 47; LatLng ll = mBaiduMap.getProjection().fromScreenLocation(p); infoWindow = new InfoWindow(tv, ll, new OnInfoWindowClickListener() { @Override public void onInfoWindowClick() { mBaiduMap.hideInfoWindow(); } }); mBaiduMap.showInfoWindow(infoWindow); mMarkerLy.setVisibility(View.VISIBLE); return true; } }); //点击屏幕其它地方。取消那些提示。还有位置信息 mBaiduMap.setOnMapClickListener(new OnMapClickListener() { @Override public boolean onMapPoiClick(MapPoi arg0) { return false; } @Override public void onMapClick(LatLng arg0) { mMarkerLy.setVisibility(View.GONE); mBaiduMap.hideInfoWindow(); } }); } /******************************************** * 初始化定位 */ private void initLocation() { //定位图层显示方式, 默觉得 LocationMode.NORMAL 普通态--还有罗盘。尾随模式 mLocationMode = LocationMode.NORMAL; //创建LocationClient,以及监听。以及设置定位监听 mLocationClient = new LocationClient(this); mLocationListener = new MyLocationListener(); mLocationClient.registerLocationListener(mLocationListener); //为locationClient进行必要的设置 LocationClientOption option = new LocationClientOption(); option.setCoorType("bd09ll");//设置百度经纬度坐标系格式 option.setIsNeedAddress(true);//某处 option.setOpenGps(true);//打开gps option.setScanSpan(1000);//每隔多少秒请求 mLocationClient.setLocOption(option);//设置必要的參数 // 视图展现的时候,先初始化一个自己定义图标 mIconLocation = BitmapDescriptorFactory .fromResource(R.drawable.navi_map_gps_locked); //传感器对象监听 myOrientationListener = new MyOrientationListener(context); //监听到改变时候,进行赋最新的值x值 myOrientationListener .setOnOrientationListener(new OnOrientationListener() { @Override public void onOrientationChanged(float x) { mCurrentX = x; } }); } private class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { //创建的位置数据 MyLocationData data = http://www.mamicode.com/new MyLocationData.Builder()//"实时交通(off)"); } else { mBaiduMap.setTrafficEnabled(true); item.setTitle("实时交通(on)"); } break; case R.id.id_map_location: //实现定位--我的位置 centerToMyLocation(); break; case R.id.id_map_mode_common: mLocationMode = LocationMode.NORMAL; break; case R.id.id_map_mode_following: mLocationMode = LocationMode.FOLLOWING; break; case R.id.id_map_mode_compass: mLocationMode = LocationMode.COMPASS; break; case R.id.id_add_overlay: addOverlays(Info.infos); break; default: break; } return super.onOptionsItemSelected(item); } /********************************************* * 加入覆盖物 * 循环得到经纬度,得到图标 * 依据MarkerOptions设置经纬度,设置图标 * 讲marker携带info,完毕地图上的加入 * */ private void addOverlays(List<Info> infos) { //清屏 mBaiduMap.clear(); //经度维度 LatLng latLng = null; // OverlayOptions options; //将marker放到地图上 Marker marker = null; for (Info info : infos) { // 经纬度 latLng = new LatLng(info.getLatitude(), info.getLongitude()); // 图标--制定marker地图上的位置(图标,放到最上层为5) options = new MarkerOptions().position(latLng).icon(mMarker) .zIndex(5); //加入 marker = (Marker) mBaiduMap.addOverlay(options); //marker携带值 Bundle arg0 = new Bundle(); arg0.putSerializable("info", info); marker.setExtraInfo(arg0); } //移动位置 MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng); mBaiduMap.setMapStatus(msu); } }
MyOrientationListener
package com.example.homebaimap; 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 mContext; // 传感器 private Sensor mSensor; private float lastX; //获取环境变量 public MyOrientationListener(Context context) { this.mContext = context; } // 開始监听 @SuppressWarnings("deprecation") public void start() { //获取监听管理者 mSensorManager = (SensorManager) mContext .getSystemService(Context.SENSOR_SERVICE); if (mSensorManager != null) { // 获得方向传感器--水平的这里用 mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); } //假设手指支持传感器 if (mSensor != null) { /** * 注冊方向改变监听--listener自己实现了传this就可以。传感器,精度, onSensorChanged实现监听的方法 */ mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_UI); } } // 结束监听 public void stop() { mSensorManager.unregisterListener(this); } @Override public void onAccuracyChanged(Sensor arg0, int arg1) { // TODO Auto-generated method stub } // 传感器改变须要的回调方法 @SuppressWarnings({ "deprecation" }) @Override public void onSensorChanged(SensorEvent event) { //假设检測到方向改变 if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) { //假设方向发生改变时候,event会携带一个类型--这里是水平。以及会携带三个数据xyz--这里是x值,而且获取x值 float x = event.values[SensorManager.DATA_X]; //发生变化 if (Math.abs(x - lastX) > 1.0) { if (mOnOrientationListener != null) { //这里有一个接口方法。传入最新的x值 mOnOrientationListener.onOrientationChanged(x); } } lastX = x; } } private OnOrientationListener mOnOrientationListener; public void setOnOrientationListener( OnOrientationListener mOnOrientationListener) { this.mOnOrientationListener = mOnOrientationListener; } public interface OnOrientationListener { void onOrientationChanged(float x); } }
另外还有那个menu文件(无关痛痒的)
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/id_map_common" android:showAsAction="never" android:title="普通地图"/> <item android:id="@+id/id_map_site" android:showAsAction="never" android:title="卫星地图"/> <item android:id="@+id/id_map_traffic" android:showAsAction="never" android:title="实时交通(off)"/> <item android:id="@+id/id_map_location" android:showAsAction="never" android:title="我的位置"/> <item android:id="@+id/id_map_mode_common" android:showAsAction="never" android:title="普通模式"/> <item android:id="@+id/id_map_mode_following" android:showAsAction="never" android:title="尾随模式"/> <item android:id="@+id/id_map_mode_compass" android:showAsAction="never" android:title="罗盘模式"/> <item android:id="@+id/id_add_overlay" android:showAsAction="never" android:title="加入覆盖物"> </item> </menu>
百度地图----->地图类型、定位模式、实时交通、我的位置、加入覆盖物、覆盖物详情及提示
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。