使用百度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,直接复制就行

       

扫描二维码关注公众号,回复: 4190416 查看本文章
<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了

猜你喜欢

转载自blog.csdn.net/q376794191/article/details/84327907