今天由于项目功能需求,使用了这个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了