在做一个软件时,用到了定位功能。网上有很多关于google 的GPS定位,但网上关于google定位都没有用,

搜索下原因:(这里建议大家在中国就尽量不使用系统自带的定位)

因为Google的服务器不在中国(就算能网上关于定位的代码能用,那也非常的慢,除非你的应用是在国外使用) 
   由于网络等原因所以定位一般会失败

于是转向使用百度api来定位。

所用到的百度API参考地址。

取得位置的百度官方sdk参考 Android定位SDK

由坐标获取地址方法参考 Geocoding API 的 7.逆地理编码

先讲解怎么使用百度api获取获取地理坐标

准备工作:

(1)第一步,下载定位Android locSDK3.3。 
下载地址: http://developer.baidu.com/map/static/doc/locSDK3.3.zip

(2)第二步,解压缩Android locSDK3.3 

准备工作至此已经结束。

一、工程配置

1、第一步,在工程里新建libs文件夹,将开发包里的locSDK_3.3.jar拷贝到libs根目录下,将liblocSDK3.so拷贝到libs\armeabi目录下,拷贝完成后的工程目录如下图所示;

2、第二步(第一步导入后可以使用就不用这一步了):在工程属性->Java Build Path->Libraries中选择“Add External JARs”,选定locSDK_3.3.jar,确定后返回。

通过以上两步操作后,您就可以正常使用百度地图定位SDK为您提供的全部功能了。

在AndroidManifest.xml加入如下所示权限及server

  1. <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
  2. </permission>
  3. <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
  4. </uses-permission>
  5. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
  6. </uses-permission>
  7. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
  8. </uses-permission>
  9. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
  10. </uses-permission>
  11. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
  12. </uses-permission>
  13. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
  14. </uses-permission>
  15. <uses-permission android:name="android.permission.READ_PHONE_STATE" >
  16. </uses-permission>
  17. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
  18. </uses-permission>
  19. <uses-permission android:name="android.permission.INTERNET" />
  20. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
  21. </uses-permission>
  22. <uses-permission android:name="android.permission.READ_LOGS" >
  23. </uses-permission>

在<application></application>标签中加入baidu server

  1. <service
  2. android:name="com.baidu.location.f"
  3. android:enabled="true"
  4. android:permission="android.permission.BAIDU_LOCATION_SERVICE"
  5. android:process=":remote" >
  6. <intent-filter>
  7. <action android:name="com.baidu.location.service_v3.3" />
  8. </intent-filter>
  9. </service>

由于Location.java继承自Application,所以需要在配置文件中<application android:name="com.baidulocation.MainActivity" ……>节中需要加android:name,其中com.genwoxue.baidulocation为我们的包名称,Location为继承Application的类名称。

<service android:name="com.baidu.location.f" android:enabled="true"   android:process=":remote"&gt;  </service>这个是来自百度定位中的服务,不可更改其中内容。

我做好的如下所示

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.baidulocation"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
  7. </permission>
  8. <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
  9. </uses-permission>
  10. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
  11. </uses-permission>
  12. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
  13. </uses-permission>
  14. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
  15. </uses-permission>
  16. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
  17. </uses-permission>
  18. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
  19. </uses-permission>
  20. <uses-permission android:name="android.permission.READ_PHONE_STATE" >
  21. </uses-permission>
  22. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
  23. </uses-permission>
  24. <uses-permission android:name="android.permission.INTERNET" />
  25. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
  26. </uses-permission>
  27. <uses-permission android:name="android.permission.READ_LOGS" >
  28. </uses-permission>
  29.  
  30. <uses-sdk
  31. android:minSdkVersion="8"
  32. android:targetSdkVersion="16" />
  33. <application
  34. android:allowBackup="true"
  35. android:icon="@drawable/ic_launcher"
  36. android:label="@string/app_name"
  37. android:theme="@style/AppTheme" >
  38. <activity
  39. android:name="com.baidulocation.MainActivity"
  40. android:label="@string/app_name" >
  41. <intent-filter>
  42. <action android:name="android.intent.action.MAIN" />
  43. <category android:name="android.intent.category.LAUNCHER" />
  44. </intent-filter>
  45. </activity>
  46. <service
  47. android:name="com.baidu.location.f"
  48. android:enabled="true"
  49. android:permission="android.permission.BAIDU_LOCATION_SERVICE"
  50. android:process=":remote" >
  51. <intent-filter>
  52. <action android:name="com.baidu.location.service_v3.3" />
  53. </intent-filter>
  54. </service>
  55. </application>
  56. </manifest>

补充:安列参考

在http://blog.csdn.net/ryantang03/article/details/7951260博客中提到可以通过 Android定位SDK 直接获取地址,但是经过实验不行。或许我这地方并不有名的原因。

于是我使用  Android定位SDK 加 Geocoding API 的模式来获取位置。

为了获取的地理坐标能在函数中被调用,我封装了定位函数

MyBaiduLotion.java

  1. package com.baidulocation;
  2. import android.content.Context;
  3. import com.baidu.location.BDLocation;
  4. import com.baidu.location.BDLocationListener;
  5. import com.baidu.location.LocationClient;
  6. import com.baidu.location.LocationClientOption;
  7. public class MyBaiduLotion {
  8.  
  9. Context myContext;
  10.  
  11. private LocationClient locationClient = null;
  12. private static final int UPDATE_TIME = 4000;
  13. private static int LOCATION_COUTNS = 0;
  14. private boolean isFinish = false;
  15. MyBDcoordinate myBDcoordinate = null;
  16. MyLocation myLocation;
  17. String strlocation = "";
  18.  
  19. public MyBaiduLotion(Context context) {
  20. // TODO Auto-generated constructor stub
  21. myContext = context;
  22. myLocation = new MyLocation();
  23. initLockPst();
  24.  
  25. }
  26.  
  27. class MyBDcoordinate{
  28. double Latitude;
  29. double Longitude;
  30. }
  31.  
  32. private void initLockPst(){
  33. locationClient = new LocationClient(this.myContext);
  34. //设置定位条件
  35. LocationClientOption option = new LocationClientOption();
  36. option.setOpenGps(true); //是否打开GPS
  37. option.setCoorType("bd09ll"); //设置返回值的坐标类型。
  38. option.setPriority(LocationClientOption.NetWorkFirst); //设置定位优先级
  39. option.setProdName("LocationDemo"); //设置产品线名称。强烈建议您使用自定义的产品线名称,方便我们以后为您提供更高效准确的定位服务。
  40. option.setScanSpan(UPDATE_TIME); //设置定时定位的时间间隔。单位毫秒
  41. locationClient.setLocOption(option);
  42.  
  43. //注册位置监听器
  44. locationClient.registerLocationListener(new BDLocationListener() {
  45.  
  46. @Override
  47. public void onReceiveLocation(BDLocation location) {
  48. // TODO Auto-generated method stub
  49. if(myBDcoordinate != null){
  50. stopOpetateClient();
  51. //locationInfoTextView.setText("stop" + LOCATION_COUTNS);
  52. return;
  53. }
  54. if(LOCATION_COUTNS > 5){
  55.  
  56. stopOpetateClient();
  57. return;
  58. }
  59. if (location == null) {
  60. LOCATION_COUTNS ++;
  61. return;
  62. }
  63. //location.getLocType();
  64. //location.getLatitude()
  65. //location.getLongitude();
  66. if(location.getLocType() != 161){
  67. LOCATION_COUTNS ++;
  68. return;
  69. }
  70. myBDcoordinate = new MyBDcoordinate();
  71. myBDcoordinate.Latitude = location.getLatitude();
  72. myBDcoordinate.Longitude = location.getLongitude();
  73.  
  74. }
  75.  
  76. @Override
  77. public void onReceivePoi(BDLocation location) {
  78. }
  79.  
  80. });
  81. }
  82.  
  83. private void stopOpetateClient(){
  84. locationClient.stop();
  85. isFinish = true;
  86. }
  87.  
  88. private void startOpetateClient(){
  89. locationClient.start();
  90. /*
  91. *当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。
  92. *调用requestLocation( )后,每隔设定的时间,定位SDK就会进行一次定位。
  93. *如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,
  94. *返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。
  95. *定时定位时,调用一次requestLocation,会定时监听到定位结果。
  96. */
  97. isFinish = false;
  98. locationClient.requestLocation();
  99. }
  100.  
  101. public boolean getIsFinish(){//获取定位是否完成或终止
  102. return isFinish;
  103. }
  104. public void opetateClient(){//开始或停止。
  105. if (locationClient == null) {
  106. return;
  107. }
  108. if (locationClient.isStarted()) {
  109. stopOpetateClient();
  110. }else {
  111. startOpetateClient();
  112. /*
  113. *当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。
  114. *调用requestLocation( )后,每隔设定的时间,定位SDK就会进行一次定位。
  115. *如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,
  116. *返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。
  117. *定时定位时,调用一次requestLocation,会定时监听到定位结果。
  118. */
  119. locationClient.requestLocation();
  120.  
  121. }
  122. }
  123.  
  124. /*********************************/
  125. public double getLatValue(){//纬度
  126. return myBDcoordinate.Latitude;
  127. }
  128. public double getLongValue(){//经度
  129. return myBDcoordinate.Longitude;
  130. }
  131.  
  132. public void desClient(){//当处在定位时Activity销毁时调用
  133. if (locationClient != null && locationClient.isStarted()) {
  134. locationClient.stop();
  135. locationClient = null;
  136. }
  137. }
  138.  
  139. }

下方Key的申请地址为: http://lbsyun.baidu.com/apiconsole/key

在官方的文档中关于官方说的返回的 json, 需要加个[] 再才能解析。于是直接封装了个直接有坐标获取地址的类。

  1. package com.baidulocation;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import org.apache.http.HttpEntity;
  5. import org.apache.http.HttpResponse;
  6. import org.apache.http.client.HttpClient;
  7. import org.apache.http.client.methods.HttpGet;
  8. import org.apache.http.impl.client.DefaultHttpClient;
  9. import org.json.JSONArray;
  10. import org.json.JSONException;
  11. import org.json.JSONObject;
  12. public class MyLocation {
  13. String key = "F9da85afead8b6e9c4738e5e5b79eb97";
  14.  
  15. public String getAddress(String latValue, String longValue){
  16. String location = getJsonLocation(latValue, longValue);
  17. location = getLocation(makeResults(location));
  18. return location;
  19. }
  20.  
  21. private String getJsonLocation(String latValue, String longValue){
  22. String urlStr = "http://api.map.baidu.com/geocoder?location=" + latValue + "," + longValue + "&output=json&key=" + key;
  23. HttpClient httpClient = new DefaultHttpClient();
  24. String responseData = "";
  25. try{
  26. //向指定的URL发送Http请求
  27. HttpResponse response = httpClient.execute(new HttpGet(urlStr));
  28. //取得服务器返回的响应
  29. HttpEntity entity = response.getEntity();
  30. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
  31. String line = "";
  32. while((line = bufferedReader.readLine()) != null){
  33. responseData = responseData + line;
  34. }
  35. }
  36. catch (Exception e) {
  37. e.printStackTrace();
  38. }
  39. return responseData;
  40. }
  41.  
  42. private String makeResults(String result){
  43. String dealResult = result.substring(0, result.indexOf("result") +8) + "[" + result.substring(result.indexOf("result") +8, result.length()-1) + "]}";
  44. return dealResult;
  45. }
  46.  
  47. private String getLocation(String str){
  48. JSONArray jsonObjs;
  49. String location = "";
  50. try {
  51. jsonObjs = new JSONObject(str).getJSONArray("result");
  52. //取出数组中第一个json对象(本示例数组中实际只包含一个元素)
  53. JSONObject jsonObj = jsonObjs.getJSONObject(0);
  54. //解析得formatted_address值
  55. String address = jsonObj.getString("formatted_address");
  56. String bussiness = jsonObj.getString("business");
  57. location = address + ":" + bussiness;
  58. } catch (JSONException e) {
  59. // TODO Auto-generated catch block
  60. e.printStackTrace();
  61. }
  62. //取出数组中第一个json对象(本示例数组中实际只包含一个元素)
  63. return location;
  64. }
  65. }

获取坐标室外会有8秒左右的延迟,所以在获取地理名称时需要等待获取坐标完成后。在主main中,定义一个线程(这里不能再直接建个类来直接获取地名了,需要在Aactivity中实现)

我的工程如下布局,主要看activity中的线程如何实现获取位置的

activity_main.xml布局如下

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context=".MainActivity" >
  6. <TextView
  7. android:id="@+id/tv_loc_info"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:layout_alignParentBottom="true"
  11. android:layout_alignParentLeft="true"
  12. android:layout_marginBottom="130dp"
  13. android:layout_marginLeft="30dp"
  14. android:text="@string/hello_world" />
  15. <Button
  16. android:id="@+id/btn_start"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:layout_above="@+id/tv_loc_info"
  20. android:layout_alignLeft="@+id/tv_loc_info"
  21. android:layout_marginBottom="52dp"
  22. android:text="Button" />
  23. </RelativeLayout>

MainActivity.java中,主要看线程内的怎么处理获取坐标的延迟。

  1. package com.baidulocation;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.os.Handler;
  5. import android.os.Message;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. import android.widget.TextView;
  10. public class MainActivity extends Activity {
  11. private TextView locationInfoTextView = null;
  12. private Button startButton = null;
  13.  
  14. MyBaiduLotion myLotion;
  15. MyLocation myLocation;
  16. String strlocation = "";
  17. @Override
  18. public void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_main);
  21.  
  22. locationInfoTextView = (TextView) this.findViewById(R.id.tv_loc_info);
  23. startButton = (Button) this.findViewById(R.id.btn_start);
  24.  
  25. startButton.setOnClickListener(new OnClickListener() {
  26.  
  27. @Override
  28. public void onClick(View v) {
  29. myLotion = new MyBaiduLotion(MainActivity.this);
  30. myLocation = new MyLocation();
  31. myLotion.opetateClient();
  32. new LocationTHread().start();
  33. }
  34. });
  35.  
  36. }
  37. class LocationTHread extends Thread{
  38. @Override
  39. public void run() {
  40. // TODO Auto-generated method stub
  41. super.run();
  42. if(myLotion != null)
  43. while(!myLotion.getIsFinish()){
  44. try {
  45. sleep(1000);
  46. } catch (InterruptedException e) {
  47. // TODO Auto-generated catch block
  48. e.printStackTrace();
  49. }
  50. }
  51. if(myLotion.myBDcoordinate != null){
  52. strlocation = myLocation.getAddress(myLotion.getLatValue() +"", myLotion.getLongValue() + "");
  53. myHandler.sendEmptyMessage(1);
  54. }
  55.  
  56. }
  57.  
  58. }
  59.  
  60. Handler myHandler = new Handler(){
  61. @Override
  62. public void handleMessage(Message msg) {
  63. // TODO Auto-generated method stub
  64. super.handleMessage(msg);
  65. locationInfoTextView.setText(strlocation);
  66. }
  67.  
  68. };
  69. @Override
  70. protected void onDestroy() {
  71. super.onDestroy();
  72. //myLotion.desClient();
  73. }
  74.  
  75. }

在手机上运行能获取坐标(室外获取到地理名称8到10秒。室内时间更长或无法定位)(需链接网咯)

源码:http://download.csdn.net/detail/djun100/6199773

【转】百度API获取城市名地名(附源码)的更多相关文章

  1. html5获取经纬度,百度api获取街区名,并使用JS保存进cookie

    引用js<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak= ...

  2. 【前端】html5获取经纬度,百度api获取街区名,并使用JS保存进cookie

    引用js<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak= ...

  3. VS2008 C++ 利用WinHttp API获取任意Http网址的源码

    最近一直在看有关Http的知识,对其基本的理论知识已经有所掌握,想通过一个C++具体的例子进行实际操作..于是上网查找了很多资料,发现在Windows系统上,可以通过WinHttp API接口开啊Ht ...

  4. arcgis api 3.x for js 入门开发系列十七在线天地图、百度地图、高德地图(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  5. php根据经纬度获取城市名

    /*php根据经纬度获取城市名*/ function get_my_addr_infos(){ $ch = curl_init(); $timeout = 5; $lat = $list['info' ...

  6. java工具类(一)之服务端java实现根据地址从百度API获取经纬度

    服务端java实现根据地址从百度API获取经纬度 代码: package com.pb.baiduapi; import java.io.BufferedReader; import java.io. ...

  7. 转:微信开发之使用java获取签名signature(贴源码,附工程)

    微信开发之使用java获取签名signature(贴源码,附工程) 标签: 微信signature获取签名 2015-12-29 22:15 6954人阅读 评论(3) 收藏 举报  分类: 微信开发 ...

  8. arcgis api 3.x for js 入门开发系列批量叠加 zip 压缩 SHP 图层优化篇(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  9. arcgis api 3.x for js 解决 textSymbol 文本换行显示(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

随机推荐

  1. 数据存储(两)--SAX发动机XML记忆(附Demo)

    Android SDK支撑SAX读取技术XML,SAX通过连续的读取方式来处理XML文件.这要求每个读数XML对应的事件触发,以处理该节点的文件的节点.以下是基于一个例子来告诉SAX使用: publi ...

  2. Eclipse 发布到网站的附加产品的形式 Update Site

    Eclipse 发布到网站的附加产品的形式 Update Site 通过Update Site Project项目将自己做的插件产品公布到公网上,给客户或其它測试人员下载和应用,这样自己的插件就以网站 ...

  3. 配置静态监听解决ORA-12514错误的案例(转)

    今天做Linux下DG配置的时候,遇到一个现象,tnsname.ora文件配置都正常,tnsping也正常,监听也正常,但是仍然报ORA-12514错误:   SQL> set lin 130 ...

  4. easyUI的combobox实现级联

    先简介下combobox: easyUI重写了select,取而代之的是combobox,有例如以下几种方式能够创建一个combobox 1.使用select标签,并加上class="eas ...

  5. GitHub版本控制

    版本控制-GitHub 前面几篇文章,我们介绍了Git的基本用法及Git服务器的搭建,本篇文章来学习一下如何使用GitHub.GitHub是开源的代码库以及版本控制库,是目前使用网络上使用最为广泛的服 ...

  6. HDU Today (图论)

    经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬 ...

  7. 使用Maven管理Spring[转]

    原文链接: Spring with Maven 原文日期: 2013年04月17日 翻译日期: 2014年06月29日 翻译人员: 铁锚 翻译原文连接:http://blog.csdn.net/ren ...

  8. opencv2对于读书笔记——二值化——thresholded功能

    opencv二进制图象值功能threshold功能 其结构 double cv::threshold( //二值化函数 const CvArr* src, //原始图像 CvArr* dst, //输 ...

  9. 高性能网络server--I/O复 select poll epoll_wait之间的差

    一个.select 方式作为收集,最多只能监控1024描述叙事断裂的文件,内部使用位操作,相应的位置1或设置0,必须是可读.可写.三类除单独的事件,内部查询方法.将全部的套接字从内核到用户空间之间进行 ...

  10. 【高德地图API】从零开始学高德JS API(一)地图展现——仙剑地图,麻点图,街景,室内图

    原文:[高德地图API]从零开始学高德JS API(一)地图展现——仙剑地图,麻点图,街景,室内图 摘要:关于地图的显示,我想大家最关心的就是麻点图,自定义底图的解决方案了吧.在过去,marker大于 ...