首先这是个第三方,基础的东西就不说了;
直接进入正题:
首先复制jar包和so文件;把so文件在gradle中配置:
sourceSets {
main {
jniLibs.srcDir 'libs'
}
在清单文件中注册service:
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote">
</service>
还需要进行key值得配置:
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="自己的key值" />
权限:
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- SD卡读取权限,用户写入离线定位数据 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
基本的环境配置已经完成;
自己的布局:
activity_location:
<com.baidu.mapapi.map.MapView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/bmapView">
</com.baidu.mapapi.map.MapView>
<Button
android:onClick="CheckLBS"
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="19dp"
android:text="检索" />
<Button
android:onClick="dao"
android:text="导航"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/button"
android:layout_toEndOf="@+id/button"
android:id="@+id/daohang" />
activity_main:
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true">
<Button
android:onClick="Fangda"
android:layout_weight="1"
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="放大"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true" />
<Button
android:onClick="Suoxiao"
android:layout_weight="1"
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="缩小"
/>
<Button
android:onClick="Xuanzhuan"
android:layout_weight="1"
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="旋转" />
<Button
android:onClick="Yidong"
android:layout_weight="1"
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="移动" />
<Button
android:onClick="Fuyang"
android:layout_weight="1"
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="俯仰" />
<Button
android:layout_weight="1"
android:id="@+id/dinwei"
android:onClick="dinwei"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="定位"
/>
</LinearLayout>
布局很简单,基本都是按钮;
下面是代码:
首先App初始化:
public class MyAPP extends Application {
@Override
public void onCreate() {
//注册一个key验证是否正确的广播所者,我们在开发APP时,经常有一些验证,比如网络等,具体流程如下
//创建一个BroadcastReceiver的内部类,
BroadcastReceiver receiver = new BroadcastReceiver() {
//复写其必须有的方法onReceive,第一个参数上下文,第二个参数是传过来的intent.
public void onReceive(Context context, Intent intent) {
//参数intent.getAction得到发送过来的Intent里的action动作
String action = intent.getAction();
//创建一个null的字符串.
String msg = "";
//进行检查,if判断字符串是否相同,action.equals(),直接用SDKInitializer.SDK_BROADTCAST_ACTION_ST...就可以了
if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK)) {
msg = "Key验证成功!";
}
//判断SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR :验证失败
else if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
msg = "Key验证失败!";
}
//判断SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR :网络错误
else if (action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
msg = "网络错误";
}
//弹吐司,内容就是字符串.
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
}
};
//代码进行广播的注册配置,也可以在清单配置文件里进行配置
IntentFilter filter = new IntentFilter();
//添加过滤条件,IntentFilter对象.addAction();内容就是SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_....
filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK);
filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
//进行广播注册,1.要注册广播类对象 2配置文件IntentFilter对象.
registerReceiver(receiver, filter);
//初始化百度地图SDK
SDKInitializer.initialize(getApplicationContext());
}
}
MainActivity:
public class MainActivity extends AppCompatActivity {
private MapView mMapView;
/**
* 清华大学
*/
protected LatLng qhPos = new LatLng(40.009424, 116.332556);
/**
* 北京坐标
*/
protected LatLng bjPos = new LatLng(39.997743, 116.316176);
/**
* 天安门坐标
*/
protected LatLng tamPos = new LatLng(39.915112, 116.403963);
private BaiduMap baiduMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//这里我没有调用SDKInitializer.initialize(getApplicationContext());因为在自定义的application的oncreate里已经定义了.
setContentView(R.layout.activity_main);
//控件初始化
initView();
//获取对MapVIew的控制类BaiduMap
baiduMap = mMapView.getMap();
//1.0,使用MapVIew对象,控制是否显示MapVIew上面的按钮
//设置不显示比例尺控件 该方法的参数是boolen,false是不显示缩放控件
mMapView.showScaleControl(false);
// 设置不显示缩放控件 该方法的参数是boolen,false是不显示比例尺控件
mMapView.showZoomControls(false);
// 2. 获取获取最小(3)、最大缩放级别(20)
float minZoomLevel = baiduMap.getMinZoomLevel();
float maxZoomLevel = baiduMap.getMaxZoomLevel();
System.out.println("minZoomLevel = " + minZoomLevel + ", maxZoomLevel = " + maxZoomLevel);
// 3. 设置地图中心点为清华大学
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLng(qhPos);
baiduMap.setMapStatus(mapStatusUpdate);
// 4. 设置地图缩放为15
mapStatusUpdate = MapStatusUpdateFactory.zoomTo(15);
baiduMap.setMapStatus(mapStatusUpdate);
}
private void initView() {
mMapView = (MapView) findViewById(R.id.bmapView);
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView = null;
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();
}
public void dinwei(View view) {
startActivity(new Intent(MainActivity.this, LocationActivity.class));
}
public void Fangda(View view) {
//放大,使用MapStatusUpdateFactory工厂调用zoomIn,得到MapStatusUpdate
MapStatusUpdate zoomIn = MapStatusUpdateFactory.zoomIn();
//在用map对象.setMapStatus,把MapStatusUpdate对象传入.
baiduMap.setMapStatus(zoomIn);
}
public void Suoxiao(View view) {
//缩小,使用MapStatusUpdateFactory工厂调用zoomOut方法,得到MapStatusUpdate
MapStatusUpdate zoomOut = MapStatusUpdateFactory.zoomOut();
//在用map对象.setMapStatus,把MapStatusUpdate对象传入.
baiduMap.setMapStatus(zoomOut);
}
public void Xuanzhuan(View view) {
//旋转(0 ~ 360),每次在原来的基础上再旋转30度
// 获取当前地图的状态,map对象.getMapStatus,直接获取到MapStatus
MapStatus mapStatus = baiduMap.getMapStatus();
//然后MapStatus.rotate就可以拿到原来的旋转度数.
float rotate = mapStatus.rotate;
//通过new MapStatus.Builder得到MapStatus.Builder对象
MapStatus.Builder builder = new MapStatus.Builder();
//用MapStatus.Builder对象.rotate(原来旋转的度数+30);
builder.rotate(rotate + 30);
//用MapStatus.Builder对象.build,得到MapStatus对象
MapStatus build = builder.build();
//用使用MapStatusUpdateFactory工厂调用newMapStatus,把MapStatus对象传入.得到MapStatusUpdate
MapStatusUpdate newMapStatus = MapStatusUpdateFactory.newMapStatus(build);
//map对象.setMapStatus,传入MapStatusUpdate对象
baiduMap.setMapStatus(newMapStatus);
}
public void Fuyang(View view) {
//俯仰(0 ~ -45),每次在原来的基础上再俯仰-5度
//获取当前地图的状态,map对象.getMapStatus,直接获取到MapStatus
MapStatus mapStatus1 = baiduMap.getMapStatus();
//然后MapStatus.overlook就可以拿到原来的俯仰度数.
float overlook = mapStatus1.overlook;
//通过new MapStatus.Builder得到MapStatus.Builder对象
MapStatus.Builder builder1 = new MapStatus.Builder();
//用MapStatus.Builder对象.overlook(原来俯仰的度数-5);
builder1.overlook(overlook - 5);
//用MapStatus.Builder对象.build,得到MapStatus对象
MapStatus build1 = builder1.build();
//用使用MapStatusUpdateFactory工厂调用newMapStatus,把MapStatus对象传入.得到MapStatusUpdate
MapStatusUpdate newMapStatusOverlook = MapStatusUpdateFactory.newMapStatus(build1);
map对象.setMapStatus,传入MapStatusUpdate对象
baiduMap.setMapStatus(newMapStatusOverlook);
}
public void Yidong(View view) {
LatLng ll=new LatLng(39.996942,116.203098);
//移动,用使用MapStatusUpdateFactory工厂调用newLatLng(LatLng参数);
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLng(ll);
//map对象.animateMapStatus,第一个参数是mapStatusUpdate对象,第二个参数是动画执行多少秒.
baiduMap.animateMapStatus(mapStatusUpdate,20000);
}
}
LocationActivity:
/**
* 实现手机定位的三种方式:
* 1.GPS定位
* 2.WIFI定位
* 3.基站定位
* 注意:定位要在清单文件加上service服务
*/
public class LocationActivity extends AppCompatActivity implements CloudListener {
private MapView mapView;
private BaiduMap mbaiduMap;
private boolean isFirstLoc = true;
private LocationClient mLocClient;
public MyLocationListenner myListener = new MyLocationListenner();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location);
initBaiduMap();
CloudManager.getInstance().init(this);
}
private void initBaiduMap() {
//创建对象
mapView = (MapView) findViewById(R.id.bmapView);
mbaiduMap = mapView.getMap();
//开启定位图层
mbaiduMap.setMyLocationEnabled(true);
// 创建定位所用到的类
mLocClient = new LocationClient(this);
//注册定位的监听器
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型,使用的地图加密算法
option.setScanSpan(1000);//可选设置定位间隔时间,注意间隔需要大于等于1000ms
mLocClient.setLocOption(option);//地图界面显示到定位位置
mLocClient.start();//开启定位
}
/**
* 点击进行步行导航
* @param v
*/
public void dao(View v){
LatLng pt1 = new LatLng(40.009424, 116.332556);
LatLng pt2 = new LatLng(39.915112, 116.403963);
// 构建 导航参数
NaviParaOption para = new NaviParaOption()
.startPoint(pt1).endPoint(pt2)
.startName("天安门").endName("百度大厦");
try {
BaiduMapNavigation.openBaiduMapWalkNavi(para, this);
} catch (BaiduMapAppNotSupportNaviException e) {
e.printStackTrace();
}
}
@Override
public void onGetSearchResult(CloudSearchResult result, int i) {
//处理从服务器得到的结果前,先判断结果对象是否存在,结果里面的表对象是否存在,结果里面的表是否有内容
if (result != null && result.poiList != null && result.poiList.size() > 0) {
//画画前,先把黑板擦干净,所以在地图上面定位表示前,先把地图清空
mbaiduMap.clear();
//创建定位标识的图片对象,使用Bitmap工厂从资料里面获取图片资源,建立对象.
BitmapDescriptor bd = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);
//建立定位点对象
LatLngBounds.Builder builder = new LatLngBounds.Builder();
//建立点对象
LatLng ll;
//使用高级for循环,把从服务器得到的json结果位置拿出来,在添加图片,成为标识显示在地图上
for (CloudPoiInfo info : result.poiList) {
//从表中拿出维度和经度,设置给点对象
ll = new LatLng(info.latitude, info.longitude);
//添加坐标图片的对象给MarkerOptions,传图片BitmapDescriptor参数,和点LatLng参数
OverlayOptions oo = new MarkerOptions().icon(bd).position(ll);
mbaiduMap.addOverlay(oo);
builder.include(ll);
}
}
}
/**
* 点击美食,执行云检索功能
* 实际:拼接字符串,发送get请求,只不过百度地图封装了逻辑
*
* @param v
*/
public void CheckLBS(View v) {
//创建百度地图特有的容器NearbySearchInfo,用来放请求我们虎鲸平台的数据
NearbySearchInfo info = new NearbySearchInfo();
//服务器的AK值,注意必须是字符串
info.ak = "wFmyh5Uggy6LR7RcW6MyhzvQeKaj5iBT";
//百度地图自定义数据库的KEY值,int型
info.geoTableId = 160758;
//设置搜索的最大半径,int型
info.radius = 30000;
//确定搜索中心的坐标,字符串,注意这里就是经度在前,维度在后
info.location = "116.403152,39.925932";
//把设置好的数据装入容器中
CloudManager.getInstance().nearbySearch(info);
}
@Override
public void onGetDetailSearchResult(DetailSearchResult detailSearchResult, int i) {
}
@Override
public void onGetCloudRgcResult(CloudRgcResult cloudRgcResult, int i) {
}
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mapView == null) {
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mbaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(18.0f);
mbaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
}
}
@Override
protected void onDestroy() {
// 退出时销毁定位
mLocClient.stop();
// 关闭定位图层
mbaiduMap.setMyLocationEnabled(false);
mapView.onDestroy();
mapView = null;
super.onDestroy();
}
}