百度地图定位LBS使用(2)

这篇搞一下code
AndroidManifest.xml 文件

下面要用到的 API_KEY,去(1)中创建的应用中查看,就是下图中访问应用对应的,复制就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.qqqq">
<!-- 此权限用于网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 此权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 此权限可以获取使用Wi-Fi等WLAN无线网络-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 此权限用于获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 改变WLAN状态的开关,如果打开或关闭Wi-Fi必需加入这个声明-->
<uses-permission android:name="android.permission.CHANGE_WIFI_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"/>
<!-- SD卡读取权限,用户写入离线数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<application
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标签和service是必须要添加的两个标签,meta标签中name属性是固定的,value属性就是你
刚才在百度那创建的应用后得到的 API_KEY 的值,service中的也是固定的,写上就行-->
<meta-data
android:name="com.baidu.lbsapi.API_KEY" android:value="jtBn5iCn3B5CEolmfwCPlSchXnQXFmTd"/>
<service android:name="com.baidu.location.f"
android:enabled="true">
</service>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
activity_main.xml 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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">
<!-- 这里的TextView 是用来测试的,看一下经纬度,地址啥的有没有错误,后面设置为不可见了-->
<TextView
android:id="@+id/show_data"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:visibility="gone"/>
<!-- 添加这个百度提供的 View,固定格式,id可以自己改-->
<com.baidu.mapapi.map.MapView
android:id="@+id/show_bdmap"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true">
</com.baidu.mapapi.map.MapView>
</android.support.constraint.ConstraintLayout>
MainActivity.java 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
public class MainActivity extends AppCompatActivity {
private TextView showData;
private LocationClient mLocationListener;
private boolean isFirstLocate=true;
private BaiduMap baiduMap;
private MapView showBdmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//进行初始化操作,这一步必须在 setContentView(R.layout.activity_main) 之前,否则会报错
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//申请权限和处理权限
List<String> permissionlist=new ArrayList<>();
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
permissionlist.add(Manifest.permission.ACCESS_COARSE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissionlist.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionlist.add(Manifest.permission.ACCESS_WIFI_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionlist.add(Manifest.permission.ACCESS_NETWORK_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CHANGE_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionlist.add(Manifest.permission.CHANGE_WIFI_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionlist.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissionlist.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {
permissionlist.add(Manifest.permission.INTERNET);
}
if(!permissionlist.isEmpty()){
String[] permissions=permissionlist.toArray(new String[permissionlist.size()]);
ActivityCompat.requestPermissions(MainActivity.this,permissions,1);
}else{
initData();
}
}
//申请权限和处理权限
public void onRequestPermissionResult(int requestCode,String[] permissions,int[] grantResults){
switch(requestCode){
case 1:
if(grantResults.length>0){
for(int result:grantResults){
if(result!=PackageManager.PERMISSION_GRANTED) {
Toast.makeText(MainActivity.this, "必须同意才能用!", Toast.LENGTH_SHORT).show();
finish();
return;
}
}
initData();
}else{
Toast.makeText(MainActivity.this,"发生未知错误!",Toast.LENGTH_SHORT);
finish();
}
break;
}
}
private void initData(){
//初始化对象
showData=findViewById(R.id.show_data);
showBdmap=findViewById(R.id.show_bdmap);
baiduMap=showBdmap.getMap(); //BaiduMap是地图总控制器,这里获取一个BaiduMap的实例
baiduMap.setMyLocationEnabled(true); //百度地图是否显示我的位置,这个必须要写,否则设备的位置将无法在地图上显示
//设置位置客户端选项
LocationClientOption option=new LocationClientOption();
//设置定位模式为高精度模式
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//设置间隔扫描的时间,每隔5秒会更新一次定位信息
option.setScanSpan(5000);
//设置是否需要地址(需要联网,百度提供的位置信息)
option.setIsNeedAddress(true);
//实例化 LocationClient 传入的context应该是全局的
mLocationListener=new LocationClient(getApplicationContext());
//将选项设置进去
mLocationListener.setLocOption(option);
//设置监听器
mLocationListener.registerLocationListener(new BDAbstractLocationListener() {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
StringBuilder currentPosition=new StringBuilder();
//获取经纬度
currentPosition.append("纬度:").append(bdLocation.getLatitude()).append("\n");
currentPosition.append("经线:").append(bdLocation.getLongitude()).append("\n");
//获取详细地址信息
currentPosition.append("国家:").append(bdLocation.getCountry()).append("\n");
currentPosition.append("省:").append(bdLocation.getProvince()).append("\n");
currentPosition.append("市:").append(bdLocation.getCity()).append("\n");
currentPosition.append("区:").append(bdLocation.getDistrict()).append("\n");
currentPosition.append("街道:").append(bdLocation.getStreet()).append("\n");
//获取定位方式
currentPosition.append("定位方式:");
if(bdLocation.getLocType()==BDLocation.TypeGpsLocation){
currentPosition.append("GPS定位");
}else if(bdLocation.getLocType()==BDLocation.TypeNetWorkLocation){
currentPosition.append("网络定位");
}
//更新地图位置
if(bdLocation.getLocType()==BDLocation.TypeGpsLocation||bdLocation.getLocType()==BDLocation.TypeNetWorkLocation){
navigateTo(bdLocation);
}
//这个就是测试一下,显示的信息是否合理
showData.setText(currentPosition);
}
});
//开始定位
mLocationListener.start();
}
//更新位置
private void navigateTo(BDLocation bdLocation) {
//只让它更新一次
if(isFirstLocate){
//获得经纬度 装进Latlng
LatLng ll=new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());
//设置地图更新位置到 MapStatusUpdate 里面
MapStatusUpdate update= MapStatusUpdateFactory.newLatLng(ll);
//地图更新
baiduMap.animateMapStatus(update);
//设置缩放比例
update=MapStatusUpdateFactory.zoomTo(16f);
//地图更新,完成缩放
baiduMap.animateMapStatus(update);
isFirstLocate=false;
}
//构建我的位置,MyLocationData.Builder这个类是用来封装当前设备所在位置的,只需将经纬度传入到这个类的相应方法中即可
MyLocationData.Builder builder=new MyLocationData.Builder();
//获取经纬度
builder.latitude(bdLocation.getLatitude());
builder.longitude(bdLocation.getLongitude());
//构建 MyLocationData 实例,只需调用MyLocationData.Builder这个类的 build()方法
MyLocationData locationData=builder.build();
//将设备当前位置显示在地图上
baiduMap.setMyLocationData(locationData);
}
//处理生命周期,这里必须要处理,像 mLocationListener.stop();如果不停止的话,会在后台不停地定位,消耗电量
protected void onResume(){
super.onResume();
showBdmap.onResume();
}
protected void onPause(){
super.onPause();
showBdmap.onPause();
}
protected void onDestroy(){
super.onDestroy();
mLocationListener.stop();
showBdmap.onDestroy();
baiduMap.setMyLocationEnabled(false);
}
}
0%