android百度定位后显示在地图上点击弹出气泡

1.到百度地图页面申请key,注意key和项目包名和数字签名一一对应的。http://developer.baidu.com/map/index.php?title=%E9%A6%96%E9%A1%B5

2.下载相应的sdk包 :http://lbsyun.baidu.com/sdk/download

3. 创建项目,加入相应的包

 

在AndroidManifest中添加开发密钥、所需权限等信息;

(1)在application中添加开发密钥

<application  
    <meta-data  
        android:name="com.baidu.lbsapi.API_KEY"  
        android:value="开发者 key" />  
   <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
        </service>
</application>

2)添加所需权限

<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" />
 

第三步,添加布局文件 ,代码里面使用该LinearLayout把mapview添加上来

<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">

    <LinearLayout         android:id="@+id/map"

        android:layout_width="fill_parent"         android:layout_height="fill_parent"         android:orientation="vertical" >     </LinearLayout>

</RelativeLayout>

还可以这样:

<com.baidu.mapapi.map.MapView  
    android:id="@+id/bmapView"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:clickable="true" />

第一种我们可以在代码设置一些配置信息,比如去掉缩放控件

 

主要代码:

package com.hck.baidumap;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

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.BaiduMapOptions;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener;
import com.baidu.mapapi.map.InfoWindow;
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.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
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;

public class MainActivity extends Activity {
	private LinearLayout mapLayout;
	private MapView mMapView;
	private BaiduMap mBaiduMap;
	boolean isFirstLoc = true;
	private BitmapDescriptor bitmap;
	private InfoWindow mInfoWindow;
	private LocationClient mLocClient;
	public MyLocationListenner myListener = new MyLocationListenner();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		SDKInitializer.initialize(getApplicationContext()); //初始化地图sdk
		mapLayout = (LinearLayout) findViewById(R.id.map);
		initMap();
		setListener();
	}
	private void initMap() {
		BaiduMapOptions options = new BaiduMapOptions();
		options.compassEnabled(false); // 不允许指南针
		options.zoomControlsEnabled(false); // 不显示缩放按钮
		options.scaleControlEnabled(false); // 不显示比例尺
		mMapView = new MapView(this, options); // 创建一个map对象
		mapLayout.addView(mMapView); // 把map添加到界面上
		mBaiduMap = mMapView.getMap(); // 获取BaiduMap对象
		mMapView.removeViewAt(1); // 去掉百度logo
		mBaiduMap.setMyLocationEnabled(false); //不显示我的位置,样覆盖物代替
		mBaiduMap.setMaxAndMinZoomLevel(18, 17); //地图的最大最小缩放比例3-18
		mLocClient = new LocationClient(this); //地图在tabhost中,请传入getApplicationContext()
		mLocClient.registerLocationListener(myListener); //绑定定位监听
		LocationClientOption option = new LocationClientOption(); //配置参数
		option.setOpenGps(true);
		option.setAddrType("all"); //设置使其可以获取具体的位置,把精度纬度换成具体地址
		option.setCoorType("bd09ll");
		option.setScanSpan(1000);
		mLocClient.setLocOption(option);
		mLocClient.start();  //开始定位
	}

	public class MyLocationListenner implements BDLocationListener {  //定位

		@Override
		public void onReceiveLocation(BDLocation location) {
            Log.d("hck", "定位定位");
			if (location == null || mMapView == null)
				return;
			MyLocationData locData = new MyLocationData.Builder()
					.accuracy(location.getRadius()).direction(100)
					.latitude(location.getLatitude())
					.longitude(location.getLongitude()).build();
			mBaiduMap.setMyLocationData(locData);
			if (isFirstLoc) {
				  Log.d("hck", "定位定位成功");
				isFirstLoc = false;
				LatLng ll = new LatLng(location.getLatitude(),
						location.getLongitude());
				MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
				mBaiduMap.animateMapStatus(u);
				mark(ll.latitude, ll.longitude, location.getAddrStr());
			}

		}

		public void onReceivePoi(BDLocation poiLocation) {

		}
	}

	private void setListener() {
		mBaiduMap.setOnMapClickListener(new OnMapClickListener() {  //点击地图事件
			@Override
			public boolean onMapPoiClick(MapPoi arg0) {
				return false;
			}

			@Override
			public void onMapClick(LatLng arg0) {
				GeoCoder getCoder = GeoCoder.newInstance();
				ReverseGeoCodeOption reCodeOption = new ReverseGeoCodeOption();
				reCodeOption.location(arg0);
				getCoder.reverseGeoCode(reCodeOption);
				getCoder.setOnGetGeoCodeResultListener(new GetAddress());

			}
		});
		mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() { //点击覆盖物事件

			@Override
			public boolean onMarkerClick(Marker arg0) {
				showLocation(arg0);
				return false;
			}
		});
	}

	private void showLocation(final Marker marker) {  //显示气泡
		// 创建InfoWindow展示的view

		LatLng pt = null;
		double latitude, longitude;
		latitude = marker.getPosition().latitude;
		longitude = marker.getPosition().longitude;

		View view = LayoutInflater.from(this).inflate(R.layout.map_item, null); //自定义气泡形状
		TextView textView = (TextView) view.findViewById(R.id.my_postion);
		pt = new LatLng(latitude + 0.0004, longitude + 0.00005);
		textView.setText(marker.getTitle());

		// 定义用于显示该InfoWindow的坐标点
		// 创建InfoWindow的点击事件监听者
		OnInfoWindowClickListener listener = new OnInfoWindowClickListener() {
			public void onInfoWindowClick() {
				mBaiduMap.hideInfoWindow();//影藏气泡

			}
		};
		// 创建InfoWindow
		mInfoWindow = new InfoWindow(view, pt, listener);
		mBaiduMap.showInfoWindow(mInfoWindow); //显示气泡

	}

	private void mark(double latitude, double longitude, String title) {//显示覆盖物

		// 定义Maker坐标点
		LatLng point = new LatLng(latitude, longitude);
		// 构建Marker图标

		bitmap = BitmapDescriptorFactory.fromResource(R.drawable.pointe_map);

		// 构建MarkerOption,用于在地图上添加Marker
		OverlayOptions option = new MarkerOptions().position(point)
				.icon(bitmap);
		// 在地图上添加Marker,并显示

		Marker marker = (Marker) mBaiduMap.addOverlay(option);
		marker.setTitle(title);
		Bundle bundle = new Bundle();

		bundle.putSerializable("recore", "ddd");
		marker.setExtraInfo(bundle);

	}

	class GetAddress implements OnGetGeoCoderResultListener { //点击地图获取点击位置处的详细地址

		@Override
		public void onGetGeoCodeResult(GeoCodeResult arg0) {

		}

		@Override
		public void onGetReverseGeoCodeResult(ReverseGeoCodeResult arg0) {
			arg0.getAddress();

			mBaiduMap.hideInfoWindow();
			mark(arg0.getLocation().latitude, arg0.getLocation().longitude,
					arg0.getAddress());
		}

	}
	 @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();  
	        }  

}
 

效果图

 

完整demo:http://download.csdn.net/detail/hhhccckkk/7962441

 

 
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值