大家好,我是一个新手,最近公司不忙自己写了一个基于百度定位的Demo,能获取到详细的小区信息,希望能帮助到和我一样的新手,写的不好请见谅
实现后的效果:
步骤如下:
<meta-data android:
name="com.baidu.lbsapi.API_KEY"
android:value="key"/>
http://lbsyun.baidu.com/index.php?title=androidsdk
2.复制权限
3.复制一个服务
<service android:name="com.baidu.location.f" android:process=":remote" android:enabled="true"> </service>
4.在build.gradle中的adnroid下复制
sourceSets {
main {
jniLibs.srcDir 'libs'
}
}
5.res下复制控件MapView 里面只有一个MapView控件
6直接复制代码:
package kunpeng.com.myapplication;
import android.database.DataSetObserver;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.location.Address;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.Poi;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.inner.GeoPoint;
import com.baidu.mapapi.search.core.PoiInfo;
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 java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private MapView mMapView = null;
private BaiduMap baiduMap;
private TextView tv;
//方便后期获取到定位的数据
private BDLocation location;
GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//初始化地图第一步
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//初始化百度地图
initMap();
//定位初始化
initLocation();
tv = (TextView) findViewById(R.id.tv);
}
public LocationClient mLocationClient = null;
BDLocationListener myBDLocationListener = new MyBDLocationListener();
private void initLocation() {
// 开启定位图层
baiduMap.setMyLocationEnabled(true);
mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类
mLocationClient.registerLocationListener(myBDLocationListener); //注册监听函数
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType("bd09ll"); // 设置坐标类型;可选,默认gcj02,设置返回的定位结果坐标系
int span=1000;
option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
option.setOpenGps(true);//可选,默认false,设置是否使用gps
option.setAddrType("all");//返回的定位结果包含地址信息
option.setPriority(LocationClientOption.GpsFirst); // 设置GPS优先
option.setLocationNotify(true);//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
option.disableCache(false);//禁止启用缓存定位
mLocationClient.setLocOption(option);
mLocationClient.start();
}
private LatLng myLocation;
private boolean isFirstLoc = true;
public class MyBDLocationListener implements BDLocationListener {
/**
* 接收异步返回的定位结果,参数是BDLocation类型参数
*/
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null) {
return;
}
StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
sb.append(location.getTime());
sb.append("\nerror code : ");
sb.append(location.getLocType());
sb.append("\nlatitude : ");
sb.append(location.getLatitude());
sb.append("\nlontitude : ");
sb.append(location.getLongitude());
sb.append("\nradius : ");
sb.append(location.getRadius());
if (location.getLocType() == BDLocation.TypeGpsLocation) {
sb.append("\nspeed : ");
sb.append(location.getSpeed());
sb.append("\nsatellite : ");
sb.append(location.getSatelliteNumber());
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
sb.append("\naddr : ");
sb.append(location.getAddrStr());
}
Log.e("log", sb.toString());
MainActivity.this.location = location;
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
baiduMap.setMyLocationData(locData);
myLocation = new LatLng(location.getLatitude(), location.getLongitude());
if (isFirstLoc) {
isFirstLoc = false;
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(myLocation).zoom(19.0f);
baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
double latitude = location.getLatitude();
double longitude = location.getLongitude();
// getLocal(latitude,longitude); //可以获取到辅路,方法一
//tv.setText(location.getAddrStr()); //可以获取到辅路 方法二
getdata(location,myLocation);
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
//获取大厦具体的位置
private void getdata(final BDLocation location, LatLng ll) {
GeoCoder geoCoder = GeoCoder.newInstance();
//
OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
// 反地理编码查询结果回调函数
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null
|| result.error != SearchResult.ERRORNO.NO_ERROR) {
// 没有检测到结果
Toast.makeText(MainActivity.this, "抱歉,未能找到结果",
Toast.LENGTH_LONG).show();
return;
}
ArrayList<PoiInfo> poiInfos = (ArrayList<PoiInfo>) result.getPoiList();
//可以获取到具体的大厦的位置
PoiInfo poiInfo = poiInfos.get(0);
// tv.setText(location.getAddrStr()+poiInfo.name); //北京市朝阳区朝阳路辅路东城国际公寓
tv.setText(poiInfo.address); //北京市东四环慈云寺东区国际
onClickLocation.getLocation(location.getAddrStr()+poiInfo.name);
}
// 地理编码查询结果回调函数
@Override
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null
|| result.error != SearchResult.ERRORNO.NO_ERROR) {
// 没有检测到结果
}
}
};
// 设置地理编码检索监听者
geoCoder.setOnGetGeoCodeResultListener(listener);
//
geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(ll));
}
//获取定位的具体信息,但是只能获取到辅路 地理编码可以单独获取不需要定位等代码
/* public void getLocal(double latitude, double longitude) {
mSearch = GeoCoder.newInstance();
LatLng latLng = new LatLng(latitude,longitude);
mSearch.reverseGeoCode(new ReverseGeoCodeOption()
.location(latLng));
mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
.show();
return;
}
baiduMap.clear();
baiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.icon_marka)));
baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
.getLocation()));
String strInfo = String.format("纬度:%f 经度:%f",
result.getLocation().latitude, result.getLocation().longitude);
Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();
tv.setText(strInfo);
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
.show();
return;
}
baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
.getLocation()));
Toast.makeText(MainActivity.this, result.getAddress(),
Toast.LENGTH_LONG).show();
tv.setText(result.getAddress());
}
});
}*/
private void initMap() {
//初始化地图
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
baiduMap = mMapView.getMap();
// 设置地图是默认样式的地图
baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, null));
baiduMap.setMyLocationEnabled(true);
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
// 关闭定位图层
baiduMap.setMyLocationEnabled(false);
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
//通过回调获取到地址
public interface OnClickLocation {
/**
* String location: 获取到的地址
* */
void getLocation(String location);
}
public OnClickLocation onClickLocation ;
public void setOnClickListener(OnClickLocation onClickLocation) {
this.onClickLocation = onClickLocation ;
}
}
我也是一个新手,大家搜到我的文章,希望能给大家带来帮助;
![微笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)
![微笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)
大家有什么好的地址:源码地址,开源框架地址可以@到评论中