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

相关文章

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意