使用百度SDK實現定位功能

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章