今天由於項目功能需求,使用了這個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了