萌新刚刚入门 Android ,想用百度地图做一个应用,但是屡屡碰壁,请教大佬。。
我已经认真阅读相关的开发文档,代码与示例相差无几,但是依旧实现不了
总是显示在北京的默认坐标,让人摸不着头脑本人在校学生,请多多包涵
代码附在下面,仅仅实现定位显示功能,请大佬们指教import android.app.Application;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
SDKInitializer.initialize(getApplicationContext()); // 初始化BaiduSDK库
SDKInitializer.setCoordType(CoordType.BD09LL); // 设置经纬坐标类型 BD09LL
}
}import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;public class MainActivity extends AppCompatActivity { private MapView mMapView = null;
private BaiduMap mBaiduMap = null;
private LocationClient mLocationClient = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMapView = findViewById(R.id.bmapView); // 获取地图控件引用
mBaiduMap = mMapView.getMap();
//普通地图 ,mBaiduMap是地图控制器对象
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
mBaiduMap.setMyLocationEnabled(true);
//定位初始化
mLocationClient = new LocationClient(getApplicationContext()); //通过LocationClientOption设置LocationClient相关参数
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000); //设置locationClientOption
mLocationClient.setLocOption(option); //注册LocationListener监听器
MyLocationListener myLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(myLocationListener);
//开启地图定位图层
mLocationClient.start();
mLocationClient.requestLocation();
}
@Override
protected void onResume() {
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
super.onResume();
}
@Override
protected void onPause() {
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mLocationClient.stop();
mBaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
} public class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// 销毁后不在处理新接收的位置
if (location == null || mMapView == null){
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(location.getDirection()).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
}
}
}密钥用 XXXXXX 替代<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.chd.ecod"> <!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <application
android:name=".MyDApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"> <meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="XXXXXX" >
</meta-data> <activity android:name=".MainActivity">
<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></manifest><?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"> <com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
</android.support.constraint.ConstraintLayout>
我已经认真阅读相关的开发文档,代码与示例相差无几,但是依旧实现不了
总是显示在北京的默认坐标,让人摸不着头脑本人在校学生,请多多包涵
代码附在下面,仅仅实现定位显示功能,请大佬们指教import android.app.Application;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
SDKInitializer.initialize(getApplicationContext()); // 初始化BaiduSDK库
SDKInitializer.setCoordType(CoordType.BD09LL); // 设置经纬坐标类型 BD09LL
}
}import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;public class MainActivity extends AppCompatActivity { private MapView mMapView = null;
private BaiduMap mBaiduMap = null;
private LocationClient mLocationClient = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMapView = findViewById(R.id.bmapView); // 获取地图控件引用
mBaiduMap = mMapView.getMap();
//普通地图 ,mBaiduMap是地图控制器对象
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
mBaiduMap.setMyLocationEnabled(true);
//定位初始化
mLocationClient = new LocationClient(getApplicationContext()); //通过LocationClientOption设置LocationClient相关参数
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000); //设置locationClientOption
mLocationClient.setLocOption(option); //注册LocationListener监听器
MyLocationListener myLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(myLocationListener);
//开启地图定位图层
mLocationClient.start();
mLocationClient.requestLocation();
}
@Override
protected void onResume() {
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
super.onResume();
}
@Override
protected void onPause() {
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mLocationClient.stop();
mBaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
} public class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// 销毁后不在处理新接收的位置
if (location == null || mMapView == null){
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(location.getDirection()).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
}
}
}密钥用 XXXXXX 替代<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.chd.ecod"> <!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <application
android:name=".MyDApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"> <meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="XXXXXX" >
</meta-data> <activity android:name=".MainActivity">
<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></manifest><?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"> <com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
</android.support.constraint.ConstraintLayout>
android:name=".MyDApplication"
D是多打的,源代码里没有D,复制粘贴的时候手误
private MapView mapView;
private BaiduMap map;
private LocationClient locationClient;
private Point centerPoint;
private boolean isFirstLoc = true;
//地理编码
private GeoCoder geoCoder;
//当前经纬度
private double lantitude;
private double longtitude;
//Poi列表
private List<PoiInfo> poiList = new ArrayList<>();
private PoiAdapter poiAdapter; public static Map1Fragment newInstance() {
return new Map1Fragment();
}
@Override
public int getLayoutRes() {
return R.layout.fragment_map1;
} @Override
public void initView(Bundle savedInstanceState) { RecyclerView recyclerView = findView(R.id.rlv_fragment_map1);
recyclerView.setLayoutManager(new LinearLayoutManager(mActivity)); poiAdapter = new PoiAdapter(null);
recyclerView.setAdapter(poiAdapter); mapView = findView(R.id.bmapView);
map = mapView.getMap(); //地理编码
geoCoder = GeoCoder.newInstance();
} @Override
public void initListener() { //地图状态改变
map.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {
@Override
public void onMapStatusChangeStart(MapStatus mapStatus) { } @Override
public void onMapStatusChangeStart(MapStatus mapStatus, int i) { } @Override
public void onMapStatusChange(MapStatus mapStatus) { } @Override
public void onMapStatusChangeFinish(MapStatus mapStatus) { }
}); //点击监听
map.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) { } @Override
public boolean onMapPoiClick(MapPoi mapPoi) {
return false;
}
}); //长按
map.setOnMapLongClickListener(new BaiduMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng latLng) { }
}); //点击覆盖物
map.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker er) {
return false;
}
}); //触摸地图
map.setOnMapTouchListener(new BaiduMap.OnMapTouchListener() {
@Override
public void onTouch(MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
// 获取当前MapView中心屏幕坐标相应的地理坐标
LatLng currentLatLng;
currentLatLng = map.getProjection().fromScreenLocation(
centerPoint);
// 发起反地理编码检索
geoCoder.reverseGeoCode((new ReverseGeoCodeOption())
.location(currentLatLng));
}
}
}); //地图加载完成
map.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {
@Override
public void onMapLoaded() { }
}); //地图定位图标点击事件监听接口
map.setOnMyLocationClickListener(new BaiduMap.OnMyLocationClickListener() {
@Override
public boolean onMyLocationClick() {
return false;
}
}); //地理编码监听
geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
//没有检索到结果
return;
} else {
double latitude = geoCodeResult.getLocation().latitude;
double longitude = geoCodeResult.getLocation().longitude;
}
} @Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
//没有找到检索结果
return;
} else { //当前
PoiInfo currentPoiInfo = new PoiInfo();
currentPoiInfo.address = reverseGeoCodeResult.getAddress();
currentPoiInfo.location = reverseGeoCodeResult.getLocation();
currentPoiInfo.name = "[位置]"; //刷新页面
poiList.clear();
poiList.add(currentPoiInfo);
poiList.addAll(reverseGeoCodeResult.getPoiList());
poiAdapter.setNewData(poiList);
}
}
}); poiAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
@Override
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
click(position);
}
});
} @Override
public void initData() {
//定位
initLocationClient();
setLocationConfig(); //map可以设置三种地图类型,以及路况,这里忽略 setMapConfig();
//开启地图定位图层
map.setMyLocationEnabled(true); //中心坐标
centerPoint = map.getMapStatus().targetScreen;
locationClient.start();//开始定位
} @Override
public void onResume() {
mapView.onResume();
super.onResume();
} @Override
public void onPause() {
mapView.onPause();
super.onPause(); } @Override
public void onDestroy() {
locationClient.stop();
mapView.onDestroy();
geoCoder.destroy();
super.onDestroy();
} private void setMapConfig() {
MyLocationConfiguration config = new MyLocationConfiguration(
MyLocationConfiguration.LocationMode.FOLLOWING, false,
null, 0xAAFFFF88, 0xAA00FF00
);
map.setMyLocationConfiguration(config);
MapStatus.Builder builder = new MapStatus.Builder();
builder.zoom(18.0f);
map.setMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
private void initLocationClient() {
locationClient = new LocationClient(Global.mContext);
locationClient.registerLocationListener(new BDAbstractLocationListener() {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
//mapView 销毁后不在处理新接收的位置
if (bdLocation == null || map == null) {
return;
} Logger.d("gxh", bdLocation.getAddrStr());
MyLocationData locData = new MyLocationData.Builder()
.accuracy(bdLocation.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(bdLocation.getDirection()).latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude()).build();
map.setMyLocationData(locData); lantitude = bdLocation.getLatitude();
longtitude = bdLocation.getLongitude(); LatLng currentLatLng = new LatLng(lantitude, longtitude); // 是否第一次定位
if (isFirstLoc) {
isFirstLoc = false;
// 实现动画跳转
MapStatusUpdate u = MapStatusUpdateFactory
.newLatLng(currentLatLng);
map.animateMapStatus(u); geoCoder.reverseGeoCode((new ReverseGeoCodeOption())
.location(currentLatLng));
return;
}
}
});
} private void setLocationConfig() {
LocationClientOption option = new LocationClientOption();
//定位模式:高精度、低功耗、仅用设备
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//设置返回经纬度坐标
option.setCoorType("bd09ll");
//设置发起定位请求的间隔
option.setScanSpan(0);
option.setOpenGps(true); //需要位置信息,返回省市县街道等
option.setIsNeedAddress(true);
//位置描述
option.setIsNeedLocationDescribe(true);
//获取周边POI信息 需要联网
option.setIsNeedLocationPoiList(true); locationClient.setLocOption(option);
}
private void click(int position) {
PoiInfo poiInfo = poiAdapter.getData().get(position);
map.clear(); //动画跳转
MapStatusUpdate u=MapStatusUpdateFactory.newLatLng(poiInfo.getLocation());
map.animateMapStatus(u); //加入覆盖物
BitmapDescriptor selectPic= BitmapDescriptorFactory.fromResource(R.drawable.circle);
OverlayOptions oo=new MarkerOptions().position(poiInfo.getLocation())
.icon(selectPic).anchor(0.5f,0.5f);
map.addOverlay(oo); //发起地理编码
geoCoder.reverseGeoCode((new ReverseGeoCodeOption())
.location(poiInfo.getLocation())); }
}