今天由于项目功能需求,使用了这个SDK。现简单总结一下制作了一个小的Demo
首先,竟然要使用百度的APL自然需要去满足它的条件,步骤如下:
1、下载百度地图的SDK
下载地址:百度地图SDK下载
2、申请key值
注册百度账号——>登录百度地图官网——>控制台—–>创建应用
获取key(也就是AK权限码)的具体方法的官网地址 :百度开放平台
按照他的提示一步一步就完成AK码的注册了。
3、将下载的SDK解压,然后将里面的东西放到项目的libs中并add将jar添加至项目依赖
4、在src/main下建立一个叫做jniLibs的文件夹,并把解压后内的文件夹靠进去,如下图:
5、在工程的“ AndroidManifest.xml ”文件添加key和Service,直接复制就行
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="j36KpKpfbA3niIDX4Boa67x2rbGlahe3" />
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" />
6、在app下的build.gradle中android先将SDK引用语句添加进去结构如下
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
7、当然还有一个很重要的东西,那便是权限了。没有权限你就啥都做不了了。全部复制添加进去进行。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" > </uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" > </uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" > </uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" > </uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" > </uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE" > </uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" > </uses-permission>
<uses-permission android:name="android.permission.READ_LOGS" > </uses-permission>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
8、好,准备工作都完成了直接看代码
布局文件如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
android:layout_height="match_parent"
tools:context="com.example.administrator.pdademo.MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始定位"
android:id="@+id/dinweiBtn"/>
<LinearLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:text="经度 : "
android:textSize="25dp"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/j"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="111"
android:textSize="25dp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:text="纬度 : "
android:textSize="25dp"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/w"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="111"
android:textSize="25dp"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
接下来就是写一个定位的服务 getDefaultLocationClientOption()方法中可设置一些属性,更多的可以去百度的官方文档查看
package com.example.administrator.pdademo;
import android.content.Context;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
/**
* @author baidu
*/
public class LocationService {
private LocationClient client = null;
private LocationClientOption mOption, DIYoption;
private Object objLock = new Object();
/***
*
* @param locationContext
*/
public LocationService(Context locationContext) {
synchronized (objLock) {
if (client == null) {
client = new LocationClient(locationContext);
client.setLocOption(getDefaultLocationClientOption());
}
}
}
/***
*
* @param listener
* @return
*/
public boolean registerListener(BDLocationListener listener) {
boolean isSuccess = false;
if (listener != null) {
client.registerLocationListener(listener);
isSuccess = true;
}
return isSuccess;
}
/***
*
* @param option
* @return isSuccessSetOption
*/
public boolean setLocationOption(LocationClientOption option) {
boolean isSuccess = false;
if (option != null) {
if (client.isStarted())
client.stop();
DIYoption = option;
client.setLocOption(option);
isSuccess = true;
}
return isSuccess;
}
public LocationClientOption getOption() {
return DIYoption;
}
/***
*
* @return DefaultLocationClientOption
*/
public LocationClientOption getDefaultLocationClientOption() {
if (mOption == null) {
mOption = new LocationClientOption();
mOption.setLocationMode(LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
mOption.setCoorType("gcj02");//可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
mOption.setScanSpan(10000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
mOption.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
mOption.setIsNeedLocationDescribe(true);//可选,设置是否需要地址描述
mOption.setNeedDeviceDirect(false);//可选,设置是否需要设备方向结果
mOption.setLocationNotify(false);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
mOption.setIgnoreKillProcess(true);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
mOption.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
mOption.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
mOption.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
}
return mOption;
}
public void start() {
synchronized (objLock) {
if (client != null && !client.isStarted()) {
client.start();
}
}
}
public void stop() {
synchronized (objLock) {
if (client != null && client.isStarted()) {
client.stop();
}
}
}
}
最后就是主方法 mListener是百度提供的一个回调方法,里面就是百度API返回的数据了,我这里只是获取了经纬度。大家如果想获取更多的数据可至百度官方文档查看一些属性。反正他的数据是全部返回了。
package com.example.administrator.pdademo;
import android.content.Context;
import android.location.LocationManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
public class MainActivity extends AppCompatActivity {
Button button;
private LocationService locationService;
String mLatitudeStr,mLongitudeStr,province;
EditText j,w;
private static final String TAG = "MainActivity";
private BDLocationListener mListener = new BDLocationListener() {
int count = 0;
@Override
public void onReceiveLocation(BDLocation location) {
mLatitudeStr = Double.toString(location.getLatitude());
mLongitudeStr = Double.toString(location.getLongitude());
Log.d(TAG, "onReceiveLocation: 纬度"+mLatitudeStr+" 经度 "+mLongitudeStr);
j.setText(mLongitudeStr);
w.setText(mLatitudeStr);
count++;
province = location.getProvince();
if (!"".equals(province) && locationService != null) {
locationService.stop();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=findViewById(R.id.dinweiBtn);
j=findViewById(R.id.j);
w=findViewById(R.id.w);
locationService=new LocationService(getApplicationContext());
locationService.registerListener(mListener);
//注册监听
locationService.setLocationOption(locationService.getDefaultLocationClientOption());
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!isopen()){
Toast.makeText(MainActivity.this, "GPS没开", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "开了", Toast.LENGTH_SHORT).show();
}
locationService.start();
}
});
}
private boolean isopen(){
LocationManager locationManager = (LocationManager)getApplicationContext().
getSystemService(Context.LOCATION_SERVICE);
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
}
OK,写完了。万事俱备只差shift+f10了
来源:CSDN
作者:晚茜
链接:https://blog.csdn.net/q376794191/article/details/84327907