用百度地图sdk返回详细地址描述

入职新公司之后,需要对现有的手机项目进行改版
第一个改版就是在应用中添加定位的功能,可以用百度地图和高德地图sdk实现。
要求:gps或者网络定位到当前位置,取精度高的位置并返回详细地址描述

先来看看使用百度地图sdk的实现方法

申请密钥:
Android SDK安全码组成:数字签名+;+包名。

数字签名是这个

用百度地图sdk返回详细地址描述_第1张图片

包名在manifest文件中查看

用百度地图sdk返回详细地址描述_第2张图片

之后我们就能拿到api_key了。


下载定位sdk放到项目中:
添加如下文件

用百度地图sdk返回详细地址描述_第3张图片

armeabi文件夹中文件和baidulbs_android.jar

添加到buildpath,你们懂得。



配置sdk:

由于百度地图sdk要在Application中初始化,重写一个application并且在manifest中配置

    

重写的application只要做一件事就行:

	@Override
	public void onCreate() {
		super.onCreate();
		SDKInitializer.initialize(this);
	}

配置服务和key

        
            
                
                
            
            
        
	      


初始化并启用定位:

这里只贴关键代码,具体项目我会在稍后上传。

//	初始化并注册
mLocationClient = new LocationClient(getActivity().getApplicationContext());
mLocationClient.registerLocationListener(this);

startLocation = (Button)view.findViewById(R.id.addfence);
startLocation.setOnClickListener(new OnClickListener() {

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		LocationClientOption option = new LocationClientOption();
		option.setLocationMode(tempMode);//设置定位模式
		option.setCoorType(tempcoor);//返回的定位结果是百度经纬度,默认值gcj02国测局坐标系
		option.setScanSpan(span);//设置发起定位请求的间隔时间为1000ms
		option.setIsNeedAddress(true);
		mLocationClient.setLocOption(option);
		
		if(startLocation.getText().equals(getString(R.string.startlocation))){
			mLocationClient.start();
			startLocation.setText(getString(R.string.stoplocation));
		}else{
			mLocationClient.stop();
			startLocation.setText(getString(R.string.startlocation));
		}
		
	}
});

mLocationClient.start()
执行之后,结果会返回到回调方法
onReceiveLocation(BDLocation location)
要接收这个结果,需要实现BDLocationListener这个接口。



定位sdk只返回了经纬度,没返回格式化地址,于是我们还需要地图sdk中的服务。
注意!地图sdk和定位sdk是区别开的。

我们在onReceiveLocation中已经取得经纬度,然后我们进行反向地理编码:将地球表面的地址坐标转换为标准地址。
这里需要实现OnGetGeoCoderResultListener这个接口。

GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用
mSearch = GeoCoder.newInstance();
mSearch.setOnGetGeoCodeResultListener(this);
LatLng ptCenter=new LatLng(location.getLatitude(), location.getLongitude());
mSearch.reverseGeoCode(new ReverseGeoCodeOption().location(ptCenter));

代码中的
location就是onReceiveLocation中取得的location
reverseGeoCode方法执行之后,结果会返回到回调方法onGetReverseGeoCodeResult之中去
然后我们在这个方法中重写我们需要的代码就可以了。

由于我使用了fragment,所以代码和普通的demo不一样。

这只是项目的部分代码,完整代码稍后上传。

源码:

package com.example.mainframework02.fragment;

import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import com.baidu.location.BDGeofence;
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.model.LatLng;
import com.baidu.mapapi.search.core.SearchResult;
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;
import com.example.activity.R;
import com.example.map.LocationApplication;

@SuppressLint("NewApi")
public class MainTab02 extends Fragment  implements BDLocationListener, OnGetGeoCoderResultListener
{
	private LocationClient mLocationClient;
	GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用
	
	private TextView LocationResult;
	private Button startLocation;
	private LocationMode tempMode = LocationMode.Hight_Accuracy;
//	private String tempcoor=BDGeofence.COORD_TYPE_GCJ;
//	private String tempcoor=BDGeofence.COORD_TYPE_BD09;//百度加密墨卡托坐标
	private String tempcoor=BDGeofence.COORD_TYPE_BD09LL;//百度加密经纬度坐标
	private int span=2000;
	
	public static final int	OPERATORS_TYPE_MOBILE=1;
	public static final int	OPERATORS_TYPE_TELECOMU =	3;
	public static final int	OPERATORS_TYPE_UNICOM	= 2;
	public static final int	OPERATORS_TYPE_UNKONW	= 0;
	
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
	{
		View view=inflater.inflate(R.layout.main_tab_02, container, false);
//		初始化并注册
		mLocationClient = new LocationClient(getActivity().getApplicationContext());
		mLocationClient.registerLocationListener(this);
//		mLocationClient = ((LocationApplication)getActivity().getApplication()).mLocationClient;
		
		LocationResult = (TextView)view.findViewById(R.id.textView1);
//		 ((LocationApplication)getActivity().getApplication()).mLocationResult = LocationResult;
		
		 mSearch = GeoCoder.newInstance();
		 mSearch.setOnGetGeoCodeResultListener(this);
		 
		startLocation = (Button)view.findViewById(R.id.addfence);
		startLocation.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				InitLocation();
				
				if(startLocation.getText().equals(getString(R.string.startlocation))){
					mLocationClient.start();
					startLocation.setText(getString(R.string.stoplocation));
				}else{
					mLocationClient.stop();
					startLocation.setText(getString(R.string.startlocation));
				}
				
			}
		});
		
		return view;
	}
	
	private void InitLocation(){
		LocationClientOption option = new LocationClientOption();
		option.setLocationMode(tempMode);//设置定位模式
		option.setCoorType(tempcoor);//返回的定位结果是百度经纬度,默认值gcj02国测局坐标系
		option.setScanSpan(span);//设置发起定位请求的间隔时间为1000ms
		option.setIsNeedAddress(true);
		mLocationClient.setLocOption(option);
	}

	@Override
	public void onGetGeoCodeResult(GeoCodeResult arg0) {
		// TODO Auto-generated method stub
		
	}

	StringBuffer sb = new StringBuffer(256);
	@Override
	public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
		// TODO Auto-generated method stub
		if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
		Log.i("GeoLog", "GeoError");
		return;
	}
	sb.append("\n详细地址信息 : ");
	sb.append(result.getAddress()+"\n");
	sb.append("\n省 : "
			+result.getAddressDetail().province
			+"\n市 : "
			+result.getAddressDetail().city
			+"\n区 : "
			+result.getAddressDetail().district
			+"\n街道 : "
			+result.getAddressDetail().street
			+"\n街道号码 : "
			+result.getAddressDetail().streetNumber+"\n");
	}

	@Override
	public void onReceiveLocation(BDLocation location) {
		// TODO Auto-generated method stub
//		StringBuffer sb = new StringBuffer(256);
		sb.setLength(0);
			sb.append("当前定位时间 : ");
			sb.append(location.getTime());
			sb.append("\n错误码 : ");
			sb.append(location.getLocType());
			sb.append("\n定位精度 : ");
			sb.append(location.getRadius());
			if (location.getLocType() == BDLocation.TypeGpsLocation){
				sb.append("\n捕捉到gps\n速度 : ");
				sb.append(location.getSpeed());
				sb.append("\n卫星数量 : ");
				sb.append(location.getSatelliteNumber());
				sb.append("\n方向 : ");
				sb.append(location.getDirection());
				
				LatLng ptCenter=new LatLng(location.getLatitude(), location.getLongitude());
				mSearch.reverseGeoCode(new ReverseGeoCodeOption().location(ptCenter));
				
//				sb.append("\n省 : ");
//				sb.append(location.getProvince());
//				sb.append("\n市 : ");
//				sb.append(location.getCity());
//				sb.append("\n区 : ");
//				sb.append(location.getDistrict());
//				sb.append("\n详细地址信息 : ");
//				sb.append(location.getAddrStr());
			} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
				sb.append("\n移动网络\n详细地址信息: ");
				sb.append(location.getAddrStr());
				sb.append("\n省 : ");
				sb.append(location.getProvince());
				sb.append("\n市 : ");
				sb.append(location.getCity());
				sb.append("\n区 : ");
				sb.append(location.getDistrict());
				//运营商信息
				sb.append("\n运营商: ");
				switch (location.getOperators()) {
				case OPERATORS_TYPE_MOBILE:
					sb.append("中国移动\n");
					break;
				case OPERATORS_TYPE_TELECOMU:
					sb.append("中国电信\n");
					break;
				case OPERATORS_TYPE_UNICOM:
					sb.append("中国联通\n");
					break;
				case OPERATORS_TYPE_UNKONW:
					sb.append("未知运营商\n");
					break;
				default:
					break;
				}
			}
			logMsg(sb.toString());
			Log.i("BaiduLocationApiDem", sb.toString());
	}
	
	@Override
	public void onStop() {
		// TODO Auto-generated method stub
		mLocationClient.stop();
		super.onStop();
	}
	@Override
	public void onDestroy() {
		mSearch.destroy();
		super.onDestroy();
	}
	
	/**
	 * 显示请求字符串
	 * @param str
	 */
	public void logMsg(String str) {
		try {
			if (LocationResult != null)
				LocationResult.setText(str);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}



你可能感兴趣的:(移动开发,android,百度地图)