1.修改AndroidManifest.xml权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.main"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="10" />
<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="2b05sutbEGMP1Cgz5UoDfnX0" />
<!-- 配置Activity: -->
<activity
android:name="com.my.main.LocationOverlayDemo"
android:label="LocationOverlayDemo"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="sensor" >
<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" >
</service>
</application>
<!-- 常用使用权限 -->
<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" />
<permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
</permission>
<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" >
</uses-permission>
<!-- <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission> -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- SDK1.5需要android.permission.GET_TASKS权限判断本程序是否为当前运行的应用? -->
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.CAMERA" >
</uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- 来电消音 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" >
</uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- 添加屏幕及版本支持: -->
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="false"
android:resizeable="true"
android:smallScreens="true" />
</manifest>
2将所需要的 jar包放到libs文件夹下,jar包下载地址:http://developer.baidu.com/map/sdkandev-download.htm
3.修改布局文件
activity_locationoverlay.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- 添加地图控件 -->
<com.my.main.MyLocationMapView android:id="@+id/bmapView"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:clickable="true"
/>
<Button
android:id="@+id/button1"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginRight="10dp"
android:layout_marginTop="10dip"
android:text="定位"
android:background="@drawable/button_style"
android:textColor="#FF000000" />
</RelativeLayout>
custom_text_view.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/popleft"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/popup_side"
android:gravity="center"
android:textStyle="bold"
android:textColor="#3814ed"
android:text="更新位置"
android:textSize="12sp" />
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/popinfo"
>
<TextView
android:id="@+id/textcache"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/popup_middle"
android:gravity="center"
android:textStyle="bold"
android:textColor="@android:color/black"
android:textSize="12sp" />
</LinearLayout>
<TextView
android:id="@+id/popdown"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/popup_down"
android:textColor="@android:color/black"
android:textSize="12sp" />
<TextView
android:id="@+id/popright"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/popup_side"
android:textColor="#3814ed"
android:gravity="center"
android:textStyle="bold"
android:text="更新marker"
android:textSize="12sp" />
</LinearLayout>
4.修改源代码
主函数的源代码
package com.my.main;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RadioGroup.OnCheckedChangeListener;
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.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.mapapi.map.PopupClickListener;
import com.baidu.mapapi.map.PopupOverlay;
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPoiInfo;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKShareUrlResult;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult;
import com.baidu.platform.comapi.basestruct.GeoPoint;
/**
* 此demo用来展示如何结合定位SDK实现定位,并使用MyLocationOverlay绘制定位位置
* 同时展示如何使用自定义图标绘制并点击时弹出泡泡
*
*/
public class LocationOverlayDemo extends Activity {
/**
*
* 添加百度所需要的控件
*
*/
private BMapManager mBMapManager;
private String a=null;
// 定位相关
LocationClient mLocClient; //须在主线程中声明
LocationData locData = null;
public MyLocationListenner myListener = new MyLocationListenner();
//定位图层
locationOverlay myLocationOverlay = null;
//弹出泡泡图层
private PopupOverlay pop = null;//弹出泡泡图层,浏览节点时使用
private TextView popupText = null;//泡泡view
private View viewCache = null;
//地图相关,使用继承MapView的MyLocationMapView目的是重写touch事件实现泡泡处理
//如果不处理touch事件,则无需继承,直接使用MapView即可
MyLocationMapView mMapView = null; // 地图View
private MapController mMapController = null;
//UI相关
Button requestLocButton = null;
boolean isRequest = false;//是否手动触发请求定位
boolean isFirstLoc = true;//是否首次定位
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* 使用地图sdk前需先初始化BMapManager.
* BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建,
* 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁
*/
mBMapManager = new BMapManager(getApplicationContext());
mBMapManager.init(new MKGeneralListener() {
@Override
public void onGetPermissionState(int error) {
if (error == MKEvent.ERROR_NETWORK_CONNECT) {
Toast.makeText(LocationOverlayDemo.this, "您的网络出错啦!", Toast.LENGTH_LONG).show();
} else if (error == MKEvent.ERROR_NETWORK_DATA) {
Toast.makeText(LocationOverlayDemo.this, "输入正确的检索条件!", Toast.LENGTH_LONG).show();
}
}
@Override
public void onGetNetworkState(int error) {
if (error == MKEvent.ERROR_PERMISSION_DENIED) {
// 授权Key错误:
Toast.makeText(LocationOverlayDemo.this, "您的授权Key出错!", Toast.LENGTH_LONG).show();
}
}
});
setContentView(R.layout.activity_locationoverlay);
CharSequence titleLable="定位功能"; //应用上端的名字
setTitle(titleLable);
requestLocButton = (Button)findViewById(R.id.button1);//定位按钮响应方法
OnClickListener btnClickListener = new OnClickListener() {
public void onClick(View v) {
requestLocClick();
}
};
requestLocButton.setOnClickListener(btnClickListener);
/**
*
* 然后实例化上面添加的百度控件
*
*/
//地图初始化
mMapView = (MyLocationMapView)findViewById(R.id.bmapView);//加载地图
mMapController = mMapView.getController();//getController这个对象可用于控制和驱动平移和缩放
mMapView.getController().setZoom(18); //设置缩放级别
mMapView.getController().enableClick(true);//可以点击缩放
mMapView.setBuiltInZoomControls(true);//表示可以缩放
//创建 弹出泡泡图层
createPaopao();
//定位初始化
mLocClient = new LocationClient( this );
locData = new LocationData();
mLocClient.registerLocationListener( myListener ); //注册监听函数,当没有注册监听函数时,无法发起网络请求
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); //打开g p s
option.setCoorType("bd09ll"); //设置坐标类型
option.setPoiExtraInfo(true); // 设置是否返回POI的电话和地址等详细信息。默认值为false,即不返回POI的电话和地址信息。
option.setAddrType("all"); //设置返回类型,all = 表示返回所有的数据
option.setScanSpan(1000);// 设置发起定位请求的间隔时间为1000ms
mLocClient.setLocOption(option);//初始化
mLocClient.start(); //发起定位请求,第一次发起定位
//定位图层初始化
myLocationOverlay = new locationOverlay(mMapView);
//设置定位数据
myLocationOverlay.setData(locData);
//添加定位图层
mMapView.getOverlays().add(myLocationOverlay);
myLocationOverlay.enableCompass();
//修改定位数据后刷新图层生效
mMapView.refresh();
}
/**
* 手动触发一次定位请求
*/
public void requestLocClick(){
isRequest = true;
mLocClient.requestLocation();
Toast.makeText(LocationOverlayDemo.this, "定位中……", Toast.LENGTH_SHORT).show();
}
/**
* 创建弹出泡泡图层
*/
public void createPaopao(){
viewCache = getLayoutInflater().inflate(R.layout.custom_text_view, null);
popupText =(TextView) viewCache.findViewById(R.id.textcache);
//泡泡点击响应回调
PopupClickListener popListener = new PopupClickListener(){
@Override
public void onClickedPopup(int index) {
Log.v("click", "clickapoapo");
}
};
pop = new PopupOverlay(mMapView,popListener);
MyLocationMapView.pop = pop;
}
/**
* 定位SDK监听函数
*/
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null)
{ return ;}
locData.latitude = location.getLatitude();
locData.longitude = location.getLongitude();
//如果不显示定位精度圈,将accuracy赋值为0即可
locData.accuracy = location.getRadius();
int type = location.getLocType();
Log.i("当前定位采用的类型是", "当前定位采用的类型是:type = " + type);
String coorType = location.getCoorType();
Log.i("坐标系类型", "坐标系类型:coorType = " + coorType);
// 获取反地理编码。 只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。
a = location.getAddrStr();
Log.i("这就是地址", "address = " + a);
Toast.makeText(LocationOverlayDemo.this, a, Toast.LENGTH_SHORT).show();
// String province = location.getProvince(); // 获取省份信息
//
// String city = location.getCity(); // 获取城市信息
// String district = location.getDistrict(); // 获取区县信息
// 此处可以设置 locData的方向信息, 如果定位 SDK 未返回方向信息,用户可以自己实现罗盘功能添加方向信息。
//更新定位数据
myLocationOverlay.setData(locData);
//更新图层数据执行刷新后生效
mMapView.refresh();
//是手动触发请求或首次定位时,移动到定位点
if (isRequest || isFirstLoc){
//移动地图到定位点
Log.d("LocationOverlay", "receive location, animate to it");
mMapController.animateTo(new GeoPoint((int)(locData.latitude* 1e6), (int)(locData.longitude * 1e6)));
}
//首次定位完成
isFirstLoc = false;
}
public void onReceivePoi(BDLocation poiLocation) {
if (poiLocation == null){
return ;
}
if(poiLocation.hasPoi()){
String poiStr = poiLocation.getPoi();
Log.i("兴趣点::", "poiStr = " + poiStr);
}
if(poiLocation.hasAddr()){
// 获取反地理编码。 只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。
String address = poiLocation.getAddrStr();
Log.i("地址是::", "address = " + address);
}
}
}
//继承MyLocationOverlay重写dispatchTap实现点击处理
public class locationOverlay extends MyLocationOverlay{
public locationOverlay(MapView mapView) {
super(mapView);
// TODO Auto-generated constructor stub
}
@Override
protected boolean dispatchTap() {
// TODO Auto-generated method stub
//处理点击事件,弹出泡泡
popupText.setBackgroundResource(R.drawable.popup);
popupText.setText(a);
pop.showPopup(BMapUtil.getBitmapFromView(popupText),
new GeoPoint((int)(locData.latitude*1e6), (int)(locData.longitude*1e6)),
8);
return true;
}
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
protected void onResume() {
mMapView.onResume();
super.onResume();
}
@Override
protected void onDestroy() {
//退出时销毁定位
if (mLocClient != null)
mLocClient.stop();
mMapView.destroy();
super.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMapView.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mMapView.onRestoreInstanceState(savedInstanceState);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
/**
* 继承MapView重写onTouchEvent实现泡泡处理操作
* @author hejin
*
*/
class MyLocationMapView extends MapView{
static PopupOverlay pop = null;//弹出泡泡图层,点击图标使用
public MyLocationMapView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyLocationMapView(Context context, AttributeSet attrs){
super(context,attrs);
}
public MyLocationMapView(Context context, AttributeSet attrs, int defStyle){
super(context, attrs, defStyle);
}
@Override
public boolean onTouchEvent(MotionEvent event){
if (!super.onTouchEvent(event)){
//消隐泡泡
if (pop != null && event.getAction() == MotionEvent.ACTION_UP)
pop.hidePop();
}
return true;
}
}
BMapUtil函数的源代码
package com.my.main;
import android.graphics.Bitmap;
import android.view.View;
public class BMapUtil {
/**
*
* @param view
* @return
*/
public static Bitmap getBitmapFromView(View view) {
view.destroyDrawingCache();
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.setDrawingCacheEnabled(true);
Bitmap bitmap = view.getDrawingCache(true);
return bitmap;
}
}