Android:使用百度地图SDK定位当前具体位置(类似QQ发表说说的选择地点功能)

本文主要是介绍Android:使用百度地图SDK定位当前具体位置(类似QQ发表说说的选择地点功能),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

百度地图 Android SDK是一套基于Android 2.1及以上版本设备的应用程序接口。 可以使用该套 SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,可以轻松访问百度地图服务和数据,构建功能丰富、交互性强的地图类应用程序。

简单的说就是可以通过调用它绘制地图,也可以进行定位。而我这次使用百度 地图API要实现类似QQ发表说说时的定位功能:

这里写图片描述
这里写图片描述

1. 使用前准备:

这里写图片描述

从百度地图SDK官网下载demo,里面有我们需要的jar包和so文件。
locSDK_XXX.jar包和 armeabi文件夹以及其中的liblocSDKX.so文件复制粘贴到libs文件夹下。并添加到构建路径。

至于密钥可以从官网获取,好像挺快,也可以直接用这个:

<!-- meta-data里添加密匙key,需要写在application中 -->  <meta-data  android:name="com.baidu.lbsapi.API_KEY"  android:value="sGFSyZlrvnHGr9GipH70G6Nd" />

2. 代码:

定位还是比较简单的,只有2个类一个布局即可实现:

  • LocationApplication.java
package com.sxkeji.baidumapdemo;import android.app.Application;
import android.util.Log;
import android.widget.TextView;import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;public class LocationApplication extends Application{public LocationClient mLocationClient;//定位SDK的核心类  public MyLocationListener mMyLocationListener;//自定义的监听类  public TextView mLocationResult,logMsg; @Overridepublic void onCreate() {super.onCreate();mLocationClient = new LocationClient(this.getApplicationContext());  mMyLocationListener = new MyLocationListener(); //注册监听器mLocationClient.registerLocationListener(mMyLocationListener); }/** * 实现实位回调监听 */  public class MyLocationListener implements BDLocationListener {  //mLocationClient.start()启动定位时回调这个方法public void onReceiveLocation(BDLocation location) {  //Receive Location   StringBuffer sb = new StringBuffer(256);  sb.append("time : ");  sb.append(location.getTime());//获得当前时间  
//              sb.append("\nerror code : ");  
//              sb.append(location.getLocType());//获得erro code得知定位现状  
//              sb.append("\nlatitude : ");  
//              sb.append(location.getLatitude());//获得纬度  
//              sb.append("\nlontitude : ");  
//              sb.append(location.getLongitude());//获得经度  
//              sb.append("\nradius : ");  
//              sb.append(location.getRadius());  if (location.getLocType() == BDLocation.TypeGpsLocation){//通过GPS定位  
//                  sb.append("\nspeed : ");  
//                  sb.append(location.getSpeed());//获得速度  
//                  sb.append("\nsatellite : ");  
//                  sb.append(location.getSatelliteNumber());  
//                  sb.append("\ndirection : ");  
//                  sb.append("\naddr : ");  sb.append(location.getAddrStr());//获得当前地址  sb.append(location.getDirection());//获得方位  } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){//通过网络连接定位  sb.append("\naddr : ");  sb.append(location.getAddrStr());//获得当前地址  //运营商信息  
//                  sb.append("\noperationers : ");  
//                  sb.append(location.getOperators());//获得经营商?  }  logMsg(sb.toString());  Log.i("BaiduLocationApiDem", sb.toString());  }  }  /** * 显示请求字符串 * @param str */  public void logMsg(String str) {  try {  if (mLocationResult != null)  mLocationResult.setText(str);  } catch (Exception e) {  e.printStackTrace();  }  }
}

MainActivity.java

package com.sxkeji.baidumapdemo;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;public class MainActivity extends Activity {private LocationClient mLocationClient;//定位SDK的核心类  private TextView LocationResult;  private Button startLocation;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mLocationClient = ((LocationApplication)getApplication()).mLocationClient;  LocationResult = (TextView)findViewById(R.id.tv);  ((LocationApplication)getApplication()).mLocationResult = LocationResult;//调用LocationApplication,获得需要的信息  startLocation = (Button)findViewById(R.id.add);  startLocation.setOnClickListener(new OnClickListener() {  public void onClick(View v) {  InitLocation();//初始化  if(startLocation.getText().equals("开启定位")){  mLocationClient.start();  startLocation.setText("停止定位");  }else{  mLocationClient.stop();  startLocation.setText("开启定位");  }  }  });  }@Override  protected void onStop() {  mLocationClient.stop();  super.onStop();  }  private void InitLocation(){  LocationClientOption option = new LocationClientOption();  option.setLocationMode(LocationMode.Hight_Accuracy);//设置高精度定位定位模式  option.setCoorType("bd09ll");//设置百度经纬度坐标系格式  option.setScanSpan(1000);//设置发起定位请求的间隔时间为1000ms  option.setIsNeedAddress(true);//反编译获得具体位置,只有网络定位才可以  mLocationClient.setLocOption(option);  }  }

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity" ><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/hello_world" /><Button android:id="@+id/add"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:text="开启定位"/>
</RelativeLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.sxkeji.baidumapdemo"android:versionCode="1"android:versionName="1.0" ><uses-sdk
        android:minSdkVersion="8"android:targetSdkVersion="18" /><!-- 定位权限 -->  <!-- 这个权限用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >  </uses-permission>  <!-- 这个权限用于访问GPS定位 -->  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >  </uses-permission> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >  </uses-permission> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >  </uses-permission><!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->  <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" />  <!-- SD卡读取权限,用户写入离线定位数据 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >  </uses-permission> <!-- 允许应用读取低级别的系统日志文件 --> <uses-permission android:name="android.permission.READ_LOGS" >  </uses-permission>  <application  android:name="com.sxkeji.baidumapdemo.LocationApplication"  android:allowBackup="true"  android:icon="@drawable/ic_launcher"  android:label="@string/app_name"  android:theme="@style/AppTheme" >  <service  android:name="com.baidu.location.f"  android:enabled="true"  android:process=":remote" >  <intent-filter>  <action android:name="com.baidu.location.service_v2.2" >  </action>  </intent-filter>  </service>  <!-- meta-data里添加密匙key,需要写在application中 -->  <meta-data  android:name="com.baidu.lbsapi.API_KEY"  android:value="sGFSyZlrvnHGr9GipH70G6Nd" />  <activity  android:name="com.sxkeji.baidumapdemo.MainActivity"  android:label="@string/app_name" >  <intent-filter>  <action android:name="android.intent.action.MAIN" />  <category android:name="android.intent.category.LAUNCHER" />  </intent-filter>  </activity>  </application>  </manifest>

以上就是全部代码,运行后就可以得到当前时间与具体位置:
这里写图片描述

3.可能出现的bug:

百度定位SDK错误:Couldn’t load locSDK3: findLibrary returned null

根据错误提示是无法找到locSDK3这个库,但是又明明在armeabi中加入了liblocSDK3.so。被这个问题困扰了很久。在做NDK开发的时候,NDK编译的so有时会在armeabi和armeabi-v7a中分别放置一份。突然想到上面的错误是不是也是因为这个原因。

然后在项目的libs目录下新建一个文件夹,命名为armeabi-v7a,然后将liblocSDK3.so复制一份到该文件夹。

再次运行项目,发现错误已经解决。

拭心记于2015/5/29 0:40 http://blog.csdn.net/u011240877

点击查看拭心Android实习生期间的收获分享

点击查看Android中文API,总有你不知道的

这篇关于Android:使用百度地图SDK定位当前具体位置(类似QQ发表说说的选择地点功能)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1023386

相关文章

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用