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实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1