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

相关文章

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

flask库中sessions.py的使用小结

《flask库中sessions.py的使用小结》在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,... 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Se

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻