1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Android使用百度地图api获取定位信息(经纬度)

Android使用百度地图api获取定位信息(经纬度)

时间:2023-08-11 18:16:13

相关推荐

Android使用百度地图api获取定位信息(经纬度)

文章目录

注册 申请密钥配置使用遇到问题

注册

登录百度地图开放平台 注册百度地图开发者,填写相关信息

提交成功后收到邮件

点击链接弹出如下提示就算激活成功了

申请密钥

点击申请密钥或者创建应用

填入应用相关信息

Android Studio获取SHA1方式

release

在底部Terminal控制台(没有这栏,在顶部View->Tool Windows选上或者AIt+F12)中,输入:keytool -list -keystore -v -keystore + .jks文件的绝对路径

keytool -list -v -keystore C:\keystore.jks

我的jks就在项目底下所以直接输入keystore.jks

然后输入密钥库口令(没印象有这东西的试试看直接回车),就成功获取我们需要的SHA1

debug

如果知道debug.keystore的路径,就和release的方式一样获取。

还可以通过点击右侧Gradle(没有这栏,在顶部View->Tool Windows选上)->appName->Tasks->android->signingReport

等待片刻就可以在Run一栏看到我们要的debug的SAH1了

申请密钥时最好把发布版和开发版的SHA1都填上,方便我们调试。

包名获取

build.gradle的applicationId或者AndroidManifest的package

注意:使用Android Studio开发,如遇到applicationId 与在 AndroidManifest.xml 中定义的包名不一致的情况,以appclicationid为准。

提交成功就可以在查看应用中看到我们的应用信息

配置

前往百度地图SDK下载所需的sdk,因为我们只需要获取定位信息,所以下载基础定位的就够了

将我们下载的基础定位包解压后,将里面的东西拷贝一份到libs文件夹中,如果没有可以新建一个。

然后在gradle配置我们的libs路径(sourceSets和defaultConfig同级)

sourceSets{main{//说明so的路径为该libs路径jniLibs.srcDir 'libs'}}

注意这边的libs是和src同级,才会生效,不同目录结构按以下修改

jniLibs.srcDirs =['src/main/libs']

然后在build.gradle添加依赖

dependencies{api files('libs/BaiduLBS_Android.jar')}

或者通过顶部File->Project Sturcture(Ctrl+Alt+Shift+S)打开窗口,根据图示选择需要的jar包,会自动引入上方代码,最后同步一下gradle。

如果需要混淆的,在proguard-rules.pro加入以下代码

-keep class com.baidu.** {*;}-keep class .** {*;}-dontwarn com.baidu.**

使用

在AndoirdMainifest.xml的application底下添加

<!-- 声明service组件 --><serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote"></service><!-- AK鉴权 --><!-- meta-data需要写在application中 --><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="申请的密钥AK" />

加入所需的权限

<!-- 这个权限用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><!-- 这个权限用于访问GPS定位--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><!-- 获取运营商信息,用于支持提供运营商信息相关的接口--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/><!-- 用于读取手机当前的状态--><uses-permission android:name="android.permission.READ_PHONE_STATE"/><!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!-- 访问网络,网络定位需要上网--><uses-permission android:name="android.permission.INTERNET" /><!-- SD卡读取权限,用户写入离线定位数据--><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

获取定位信息我用了官方demo中的LocationService(最后会附上代码),在需要的activity初始化中加入

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_location);locationService = new LocationService(this);locationService.registerListener(mListener);locationService.setLocationOption(locationService.getDefaultLocationClientOption());}

初始化location实例

locationService = new LocationService(this);

如果是多个activity中使用建议在Application中初始化location实例,新建一个App类

public class App extends Application {public LocationService locationService;@Overridepublic void onCreate() {super.onCreate();locationService = new LocationService(this);}}

在AndoirdMainifest.xml的application加上name属性

<applicationandroid:name=".App"></application>

然后在我们要用的activity中获取Application中的实例

locationService = ((App) getApplication()).locationService;

注册定位服务

locationService.registerListener(mListener);

mListener为我们定位后的回调结果

/******* 定位结果回调,重写onReceiveLocation方法**/private BDAbstractLocationListener mListener = new BDAbstractLocationListener() {@Overridepublic void onReceiveLocation(BDLocation location) {// TODO Auto-generated method stubif (null != location && location.getLocType() != BDLocation.TypeServerError) {//获取信息后的操作}}};

设置配置

locationService.setLocationOption(locationService.getDefaultLocationClientOption());

目前我使用的是demo中的默认配置,可按自己的要求修改

//默认Option设置 public LocationClientOption getDefaultLocationClientOption(){if(mOption == null){mOption = new LocationClientOption();mOption.setLocationMode(LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备mOption.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;mOption.setScanSpan(3000);//可选,默认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信息,默认收集mOption.setOpenGps(true);//可选,默认false,设置是否开启Gps定位mOption.setIsNeedAltitude(false);//可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用}return mOption;}

初始化以及注册实例后我们就可以使用了,在要定位的启动

//启动locationService.start();

停止定位

//停止locationService.stop();

当然不要忘了在销毁页面注销监听

@Overrideprotected void onDestroy() {super.onDestroy();locationService.unregisterListener(mListener); //注销掉监听locationService.stop(); //停止定位服务}

效果图如下

最后附上代码

LocationService.class

import android.content.Context;import com.baidu.location.BDAbstractLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.location.LocationClientOption.LocationMode;public class LocationService {private LocationClient client = null;private LocationClientOption mOption,DIYoption;private Object objLock = new Object();public LocationService(Context locationContext){synchronized (objLock) {if(client == null){client = new LocationClient(locationContext);client.setLocOption(getDefaultLocationClientOption());}}}// 注册public boolean registerListener(BDAbstractLocationListener listener){boolean isSuccess = false;if(listener != null){client.registerLocationListener(listener);isSuccess = true;}return isSuccess;}// 注销public void unregisterListener(BDAbstractLocationListener listener){if(listener != null){client.unRegisterLocationListener(listener);}}//设置配置public boolean setLocationOption(LocationClientOption option){boolean isSuccess = false;if(option != null){if(client.isStarted())client.stop();DIYoption = option;client.setLocOption(option);}return isSuccess;}//默认Option设置 public LocationClientOption getDefaultLocationClientOption(){if(mOption == null){mOption = new LocationClientOption();mOption.setLocationMode(LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备mOption.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;mOption.setScanSpan(3000);//可选,默认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信息,默认收集mOption.setOpenGps(true);//可选,默认false,设置是否开启Gps定位mOption.setIsNeedAltitude(false);//可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用}return mOption;}//自定义Option设置public LocationClientOption getOption(){if(DIYoption == null) {DIYoption = new LocationClientOption();}return DIYoption;}public void start(){synchronized (objLock) {if(client != null && !client.isStarted()){client.start();}}}public void stop(){synchronized (objLock) {if(client != null && client.isStarted()){client.stop();}}}public boolean isStart() {return client.isStarted();}public boolean requestHotSpotState(){return client.requestHotSpotState();}}

LocationActivity.class

import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import com.baidu.location.BDAbstractLocationListener;import com.baidu.location.BDLocation;import com.baidu.location.Poi;import com.ffcs.imr.service.LocationService;public class LocationActivity extends Activity {private LocationService locationService;private TextView mTextView;private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_location);mTextView = findViewById(R.id.textview);button = findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (button.getText().toString().equals("打开定位")) {locationService.start();} else {locationService.stop();button.setText("打开定位");mTextView.setText("");}}});locationService = new LocationService(this);// 多个activity// locationService = ((App) getApplication()).locationService;locationService.registerListener(mListener);locationService.setLocationOption(locationService.getDefaultLocationClientOption());}@Overrideprotected void onDestroy() {super.onDestroy();locationService.unregisterListener(mListener); //注销掉监听locationService.stop(); //停止定位服务}/******* 定位结果回调,重写onReceiveLocation方法,可以直接拷贝如下代码到自己工程中修改**/private BDAbstractLocationListener mListener = new BDAbstractLocationListener() {@Overridepublic void onReceiveLocation(BDLocation location) {// TODO Auto-generated method stubif (null != location && location.getLocType() != BDLocation.TypeServerError) {button.setText("停止定位");StringBuilder sb = new StringBuilder(256);sb.append("time : ");/*** 时间也可以使用systemClock.elapsedRealtime()方法 获取的是自从开机以来,每次回调的时间;* location.getTime() 是指服务端出本次结果的时间,如果位置不发生变化,则时间不变*/sb.append(location.getTime());sb.append("\nlocType : ");// 定位类型sb.append(location.getLocType());sb.append("\nlocType description : ");// *****对应的定位类型说明*****sb.append(location.getLocTypeDescription());sb.append("\nlatitude : ");// 纬度sb.append(location.getLatitude());sb.append("\nlontitude : ");// 经度sb.append(location.getLongitude());sb.append("\nradius : ");// 半径sb.append(location.getRadius());sb.append("\nCountryCode : ");// 国家码sb.append(location.getCountryCode());sb.append("\nCountry : ");// 国家名称sb.append(location.getCountry());sb.append("\ncitycode : ");// 城市编码sb.append(location.getCityCode());sb.append("\ncity : ");// 城市sb.append(location.getCity());sb.append("\nDistrict : ");// 区sb.append(location.getDistrict());sb.append("\nStreet : ");// 街道sb.append(location.getStreet());sb.append("\naddr : ");// 地址信息sb.append(location.getAddrStr());sb.append("\nUserIndoorState: ");// *****返回用户室内外判断结果*****sb.append(location.getUserIndoorState());sb.append("\nDirection(not all devices have value): ");sb.append(location.getDirection());// 方向sb.append("\nlocationdescribe: ");sb.append(location.getLocationDescribe());// 位置语义化信息sb.append("\nPoi: ");// POI信息if (location.getPoiList() != null && !location.getPoiList().isEmpty()) {for (int i = 0; i < location.getPoiList().size(); i++) {Poi poi = (Poi) location.getPoiList().get(i);sb.append(poi.getName() + ";");}}if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果sb.append("\nspeed : ");sb.append(location.getSpeed());// 速度 单位:km/hsb.append("\nsatellite : ");sb.append(location.getSatelliteNumber());// 卫星数目sb.append("\nheight : ");sb.append(location.getAltitude());// 海拔高度 单位:米sb.append("\ngps status : ");sb.append(location.getGpsAccuracyStatus());// *****gps质量判断*****sb.append("\ndescribe : ");sb.append("gps定位成功");} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果// 运营商信息if (location.hasAltitude()) {// *****如果有海拔高度*****sb.append("\nheight : ");sb.append(location.getAltitude());// 单位:米}sb.append("\noperationers : ");// 运营商信息sb.append(location.getOperators());sb.append("\ndescribe : ");sb.append("网络定位成功");} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果sb.append("\ndescribe : ");sb.append("离线定位成功,离线定位结果也是有效的");} else if (location.getLocType() == BDLocation.TypeServerError) {sb.append("\ndescribe : ");sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@,会有人追查原因");} else if (location.getLocType() == BDLocation.TypeNetWorkException) {sb.append("\ndescribe : ");sb.append("网络不同导致定位失败,请检查网络是否通畅");} else if (location.getLocType() == BDLocation.TypeCriteriaException) {sb.append("\ndescribe : ");sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");}logMsg(sb.toString());}}};/*** 显示请求字符串*/public void logMsg(final String str) {try {new Thread(new Runnable() {@Overridepublic void run() {mTextView.post(new Runnable() {@Overridepublic void run() {mTextView.setText(str);}});}}).start();} catch (Exception e) {e.printStackTrace();}}}

activity_location.xml

<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="打开定位" /><TextViewandroid:id="@+id/textview"android:layout_width="wrap_content"android:layout_height="0dp"app:layout_constraintTop_toBottomOf="@+id/button" /></android.support.constraint.ConstraintLayout>

遇到问题

NetWork location failed because baidu location service can not decrypt the request query, please check the so file!

a. 确保自己的so文件没有少

b. 在检查下build.gradle的lib配置是否正确,详细内容请看本文的配置 。NetWork location failed because baidu location service check the key is unlegal, please check the key in AndroidManifest.xml!

a. 先检查AndroidManifest.xml是否配置了AK

b. 看看申请的包名和所用的AK是否匹配

c. 注意下自己申请的时候用的SHA1是哪个版本的,如果你直接运行AndroidStudio的debug版本,要确保有在申请的时候填入相应的SHA1。打包路径的签名只能让你release版本使用定位功能。debug版本的签名获取请看本文的申请密钥 。Offline location failed, please check the net (wifi/cell)!

a. 检查网路是否打开

b. 是否在AndroidManifest.xml加入网络权限

c. 是否赋予应用网络权限,权限的选择看本文的使用Location failed beacuse we can not get any loc information!

a. 是否在AndroidManifest.xml加入定位权限

b. 是否赋予应用定位权限,权限的选择看本文的使用 无法获取定位信息定位成功定位一次后,接下来无法获取定位信息回调BDAbstractLocationListener没有执行

检查错误3是否发生,再确认AndoirdMainifest.xml的application有没有加上

<!-- 声明service组件 --><serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote"></service><!-- AK鉴权 --><!-- meta-data需要写在application中 --><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="申请的密钥AK" />

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。