使用百度SDK实现定位功能

今天由于项目功能需求,使用了这个SDK。现简单总结一下制作了一个小的Demo

首先,竟然要使用百度的APL自然需要去满足它的条件,步骤如下:

1、下载百度地图的SDK 
      下载地址:百度地图SDK下载
2、申请key值 
      注册百度账号——>登录百度地图官网——>控制台—–>创建应用 
      获取key(也就是AK权限码)的具体方法的官网地址 :百度开放平台 

     使用百度SDK实现定位功能_第1张图片

      按照他的提示一步一步就完成AK码的注册了。

3、将下载的SDK解压,然后将里面的东西放到项目的libs中并add将jar添加至项目依赖

            使用百度SDK实现定位功能_第2张图片

4、在src/main下建立一个叫做jniLibs的文件夹,并把解压后内的文件夹靠进去,如下图:

         使用百度SDK实现定位功能_第3张图片

5、在工程的“ AndroidManifest.xml ”文件添加key和Service,直接复制就行

       


6、在app下的build.gradle中android先将SDK引用语句添加进去结构如下

   

sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

      使用百度SDK实现定位功能_第4张图片

7、当然还有一个很重要的东西,那便是权限了。没有权限你就啥都做不了了。全部复制添加进去进行。

      




    
    
    
    
    
    
    
    

    
    


8、好,准备工作都完成了直接看代码

        布局文件如下




    

接下来就是写一个定位的服务   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了

你可能感兴趣的:(Android)