天天看点

百度API获取地名

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

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

   因为Google的服务器不在中国(就算能网上关于定位的代码能用,那也非常的慢,除非你的应用是在国外使用)

   由于网络等原因所以定位一般会失败

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

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

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

准备工作:

  (1)第一步,下载定位Android locSDK3.3。

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

  准备工作至此已经结束。

一、工程配置

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

<a target="_blank" href="http://blog.51cto.com/attachment/201309/222831934.jpg"></a>

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<code>&lt;</code><code>permission</code> <code>android:name</code><code>=</code><code>"android.permission.BAIDU_LOCATION_SERVICE"</code> <code>&gt;</code>

<code>   </code><code>&lt;/</code><code>permission</code><code>&gt;</code>

<code>   </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.BAIDU_LOCATION_SERVICE"</code> <code>&gt;</code>

<code>   </code><code>&lt;/</code><code>uses-permission</code><code>&gt;</code>

<code>   </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.ACCESS_COARSE_LOCATION"</code> <code>&gt;</code>

<code>   </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.ACCESS_FINE_LOCATION"</code> <code>&gt;</code>

<code>   </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.ACCESS_WIFI_STATE"</code> <code>&gt;</code>

<code>   </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.ACCESS_NETWORK_STATE"</code> <code>&gt;</code>

<code>   </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.CHANGE_WIFI_STATE"</code> <code>&gt;</code>

<code>   </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.READ_PHONE_STATE"</code> <code>&gt;</code>

<code>   </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.WRITE_EXTERNAL_STORAGE"</code> <code>&gt;</code>

<code>   </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.INTERNET"</code> <code>/&gt;</code>

<code>   </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.MOUNT_UNMOUNT_FILESYSTEMS"</code> <code>&gt;</code>

<code>   </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.READ_LOGS"</code> <code>&gt;</code>

在&lt;application&gt;&lt;/application&gt;标签中加入baidu server

<code>&lt;</code><code>service</code>

<code>            </code><code>android:name</code><code>=</code><code>"com.baidu.location.f"</code>

<code>            </code><code>android:enabled</code><code>=</code><code>"true"</code>

<code>            </code><code>android:permission</code><code>=</code><code>"android.permission.BAIDU_LOCATION_SERVICE"</code>

<code>            </code><code>android:process</code><code>=</code><code>":remote"</code> <code>&gt;</code>

<code>            </code><code>&lt;</code><code>intent-filter</code><code>&gt;</code>

<code>                </code><code>&lt;</code><code>action</code> <code>android:name</code><code>=</code><code>"com.baidu.location.service_v3.3"</code> <code>/&gt;</code>

<code>            </code><code>&lt;/</code><code>intent-filter</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>service</code><code>&gt;</code>

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

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

我做好的如下所示

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

<code>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf-8"</code><code>?&gt;</code>

<code>&lt;</code><code>manifest</code> <code>xmlns:android</code><code>=</code><code>"http://schemas.android.com/apk/res/android"</code>

<code>    </code><code>package</code><code>=</code><code>"com.baidulocation"</code>

<code>    </code><code>android:versionCode</code><code>=</code><code>"1"</code>

<code>    </code><code>android:versionName</code><code>=</code><code>"1.0"</code> <code>&gt;</code>

<code>     </code><code>&lt;</code><code>permission</code> <code>android:name</code><code>=</code><code>"android.permission.BAIDU_LOCATION_SERVICE"</code> <code>&gt;</code>

<code>    </code><code>&lt;/</code><code>permission</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.BAIDU_LOCATION_SERVICE"</code> <code>&gt;</code>

<code>    </code><code>&lt;/</code><code>uses-permission</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.ACCESS_COARSE_LOCATION"</code> <code>&gt;</code>

<code>    </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.ACCESS_FINE_LOCATION"</code> <code>&gt;</code>

<code>    </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.ACCESS_WIFI_STATE"</code> <code>&gt;</code>

<code>    </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.ACCESS_NETWORK_STATE"</code> <code>&gt;</code>

<code>    </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.CHANGE_WIFI_STATE"</code> <code>&gt;</code>

<code>    </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.READ_PHONE_STATE"</code> <code>&gt;</code>

<code>    </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.WRITE_EXTERNAL_STORAGE"</code> <code>&gt;</code>

<code>    </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.INTERNET"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.MOUNT_UNMOUNT_FILESYSTEMS"</code> <code>&gt;</code>

<code>    </code><code>&lt;</code><code>uses-permission</code> <code>android:name</code><code>=</code><code>"android.permission.READ_LOGS"</code> <code>&gt;</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                         </code> 

<code>    </code><code>&lt;</code><code>uses-sdk</code>

<code>        </code><code>android:minSdkVersion</code><code>=</code><code>"8"</code>

<code>        </code><code>android:targetSdkVersion</code><code>=</code><code>"16"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>application</code>

<code>        </code><code>android:allowBackup</code><code>=</code><code>"true"</code>

<code>        </code><code>android:icon</code><code>=</code><code>"@drawable/ic_launcher"</code>

<code>        </code><code>android:label</code><code>=</code><code>"@string/app_name"</code>

<code>        </code><code>android:theme</code><code>=</code><code>"@style/AppTheme"</code> <code>&gt;</code>

<code>        </code><code>&lt;</code><code>activity</code>

<code>            </code><code>android:name</code><code>=</code><code>"com.baidulocation.MainActivity"</code>

<code>            </code><code>android:label</code><code>=</code><code>"@string/app_name"</code> <code>&gt;</code>

<code>                </code><code>&lt;</code><code>action</code> <code>android:name</code><code>=</code><code>"android.intent.action.MAIN"</code> <code>/&gt;</code>

<code>                </code><code>&lt;</code><code>category</code> <code>android:name</code><code>=</code><code>"android.intent.category.LAUNCHER"</code> <code>/&gt;</code>

<code>        </code><code>&lt;/</code><code>activity</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>service</code>

<code>    </code><code>&lt;/</code><code>application</code><code>&gt;</code>

<code>&lt;/</code><code>manifest</code><code>&gt;</code>

补充:安列参考

<a href="http://developer.baidu.com/map/geosdk-android-download.htm"></a>

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

MyBaiduLotion.java

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

<code>package</code> <code>com.baidulocation;</code>

<code>import</code> <code>android.content.Context;</code>

<code>import</code> <code>com.baidu.location.BDLocation;</code>

<code>import</code> <code>com.baidu.location.BDLocationListener;</code>

<code>import</code> <code>com.baidu.location.LocationClient;</code>

<code>import</code> <code>com.baidu.location.LocationClientOption;</code>

<code>public</code> <code>class</code> <code>MyBaiduLotion {</code>

<code>                                                                                                                                                                                                                                                              </code> 

<code>    </code><code>Context myContext;</code>

<code>    </code><code>private</code> <code>LocationClient locationClient = </code><code>null</code><code>;</code>

<code>    </code><code>private</code> <code>static</code> <code>final</code> <code>int</code> <code>UPDATE_TIME = </code><code>4000</code><code>;</code>

<code>    </code><code>private</code> <code>static</code> <code>int</code> <code>LOCATION_COUTNS = </code><code>0</code><code>;</code>

<code>    </code><code>private</code> <code>boolean</code> <code>isFinish = </code><code>false</code><code>;</code>

<code>    </code><code>MyBDcoordinate myBDcoordinate = </code><code>null</code><code>;</code>

<code>    </code><code>MyLocation myLocation;</code>

<code>    </code><code>String strlocation = </code><code>""</code><code>;</code>

<code>    </code><code>public</code> <code>MyBaiduLotion(Context context) {</code>

<code>        </code><code>// TODO Auto-generated constructor stub</code>

<code>        </code><code>myContext = context;</code>

<code>        </code><code>myLocation = </code><code>new</code> <code>MyLocation();</code>

<code>        </code><code>initLockPst();</code>

<code>                                                                                                                                                                                                                                                                  </code> 

<code>    </code><code>}</code>

<code>    </code><code>class</code> <code>MyBDcoordinate{</code>

<code>        </code><code>double</code> <code>Latitude;</code>

<code>        </code><code>double</code> <code>Longitude;</code>

<code>     </code><code>private</code> <code>void</code> <code>initLockPst(){</code>

<code>            </code><code>locationClient = </code><code>new</code> <code>LocationClient(</code><code>this</code><code>.myContext);</code>

<code>            </code><code>//设置定位条件</code>

<code>            </code><code>LocationClientOption option = </code><code>new</code> <code>LocationClientOption();</code>

<code>            </code><code>option.setOpenGps(</code><code>true</code><code>);        </code><code>//是否打开GPS</code>

<code>            </code><code>option.setCoorType(</code><code>"bd09ll"</code><code>);       </code><code>//设置返回值的坐标类型。</code>

<code>            </code><code>option.setPriority(LocationClientOption.NetWorkFirst);  </code><code>//设置定位优先级</code>

<code>            </code><code>option.setProdName(</code><code>"LocationDemo"</code><code>); </code><code>//设置产品线名称。强烈建议您使用自定义的产品线名称,方便我们以后为您提供更高效准确的定位服务。</code>

<code>            </code><code>option.setScanSpan(UPDATE_TIME);    </code><code>//设置定时定位的时间间隔。单位毫秒</code>

<code>            </code><code>locationClient.setLocOption(option);</code>

<code>                                                                                                                                                                                                                                                                      </code> 

<code>            </code><code>//注册位置监听器</code>

<code>            </code><code>locationClient.registerLocationListener(</code><code>new</code> <code>BDLocationListener() {</code>

<code>                                                                                                                                                                                                                                                                          </code> 

<code>                </code><code>@Override</code>

<code>                </code><code>public</code> <code>void</code> <code>onReceiveLocation(BDLocation location) {</code>

<code>                    </code><code>// TODO Auto-generated method stub</code>

<code>                    </code><code>if</code><code>(myBDcoordinate != </code><code>null</code><code>){</code>

<code>                        </code><code>stopOpetateClient();</code>

<code>                        </code><code>//locationInfoTextView.setText("stop" + LOCATION_COUTNS);</code>

<code>                        </code><code>return</code><code>;</code>

<code>                    </code><code>}</code>

<code>                    </code><code>if</code><code>(LOCATION_COUTNS &gt; </code><code>5</code><code>){</code>

<code>                                                                                                                                                                                                                                                                                  </code> 

<code>                    </code><code>if</code> <code>(location == </code><code>null</code><code>) {</code>

<code>                        </code><code>LOCATION_COUTNS ++;</code>

<code>                    </code><code>//location.getLocType();</code>

<code>                    </code><code>//location.getLatitude()</code>

<code>                    </code><code>//location.getLongitude();</code>

<code>                    </code><code>if</code><code>(location.getLocType() != </code><code>161</code><code>){</code>

<code>                    </code><code>myBDcoordinate = </code><code>new</code> <code>MyBDcoordinate();</code>

<code>                    </code><code>myBDcoordinate.Latitude = location.getLatitude();</code>

<code>                    </code><code>myBDcoordinate.Longitude = location.getLongitude();</code>

<code>                                                                                                                                                                                                                                                                              </code> 

<code>                </code><code>}</code>

<code>                </code><code>public</code> <code>void</code> <code>onReceivePoi(BDLocation location) {</code>

<code>            </code><code>});</code>

<code>        </code><code>}</code>

<code>                                                                                                                                                                                                                                                               </code> 

<code>     </code><code>private</code> <code>void</code> <code>stopOpetateClient(){</code>

<code>         </code><code>locationClient.stop();</code>

<code>         </code><code>isFinish = </code><code>true</code><code>;</code>

<code>     </code><code>}</code>

<code>     </code><code>private</code> <code>void</code> <code>startOpetateClient(){</code>

<code>         </code><code>locationClient.start();</code>

<code>            </code><code>/*</code>

<code>             </code><code>*当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。</code>

<code>             </code><code>*调用requestLocation( )后,每隔设定的时间,定位SDK就会进行一次定位。</code>

<code>             </code><code>*如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,</code>

<code>             </code><code>*返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。</code>

<code>             </code><code>*定时定位时,调用一次requestLocation,会定时监听到定位结果。</code>

<code>             </code><code>*/</code>

<code>         </code><code>isFinish = false;</code>

<code>            </code><code>locationClient.requestLocation();</code>

<code>     </code><code>public boolean getIsFinish(){//获取定位是否完成或终止</code>

<code>         </code><code>return isFinish;</code>

<code>     </code><code>public void opetateClient(){//开始或停止。</code>

<code>         </code><code>if (locationClient == null) {</code>

<code>                </code><code>return;</code>

<code>            </code><code>}</code>

<code>            </code><code>if (locationClient.isStarted()) {</code>

<code>                </code><code>stopOpetateClient();</code>

<code>            </code><code>}else {</code>

<code>                </code><code>startOpetateClient();</code>

<code>                </code><code>/*</code>

<code>                 </code><code>*当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。</code>

<code>                 </code><code>*调用requestLocation( )后,每隔设定的时间,定位SDK就会进行一次定位。</code>

<code>                 </code><code>*如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,</code>

<code>                 </code><code>*返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。</code>

<code>                 </code><code>*定时定位时,调用一次requestLocation,会定时监听到定位结果。</code>

<code>                 </code><code>*/</code>

<code>                </code><code>locationClient.requestLocation();</code>

<code>     </code><code>/*********************************/</code>

<code>    </code><code>public</code> <code>double</code> <code>getLatValue(){</code><code>//纬度</code>

<code>        </code><code>return</code> <code>myBDcoordinate.Latitude;</code>

<code>    </code><code>public</code> <code>double</code> <code>getLongValue(){</code><code>//经度</code>

<code>        </code><code>return</code> <code>myBDcoordinate.Longitude;</code>

<code>     </code><code>public</code> <code>void</code> <code>desClient(){</code><code>//当处在定位时Activity销毁时调用</code>

<code>         </code><code>if</code> <code>(locationClient != </code><code>null</code> <code>&amp;&amp; locationClient.isStarted()) {</code>

<code>                </code><code>locationClient.stop();</code>

<code>                </code><code>locationClient = </code><code>null</code><code>;</code>

<code>}</code>

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

<code>import</code> <code>java.io.BufferedReader;</code>

<code>import</code> <code>java.io.InputStreamReader;</code>

<code>import</code> <code>org.apache.http.HttpEntity;</code>

<code>import</code> <code>org.apache.http.HttpResponse;</code>

<code>import</code> <code>org.apache.http.client.HttpClient;</code>

<code>import</code> <code>org.apache.http.client.methods.HttpGet;</code>

<code>import</code> <code>org.apache.http.impl.client.DefaultHttpClient;</code>

<code>import</code> <code>org.json.JSONArray;</code>

<code>import</code> <code>org.json.JSONException;</code>

<code>import</code> <code>org.json.JSONObject;</code>

<code>public</code> <code>class</code> <code>MyLocation {</code>

<code>    </code><code>String key = </code><code>"F9da85afead8b6e9c4738e5e5b79eb97"</code><code>;</code>

<code>                                                                                                                                                                                                                 </code> 

<code>    </code><code>public</code> <code>String getAddress(String latValue, String longValue){</code>

<code>        </code><code>String location = getJsonLocation(latValue, longValue);</code>

<code>        </code><code>location = getLocation(makeResults(location));</code>

<code>        </code><code>return</code> <code>location;</code>

<code>    </code><code>private</code> <code>String getJsonLocation(String latValue, String longValue){</code>

<code>        </code><code>String urlStr = </code><code>"http://api.map.baidu.com/geocoder?location="</code> <code>+ latValue + </code><code>","</code> <code>+ longValue + </code><code>"&amp;output=json&amp;key="</code> <code>+ key;</code>

<code>        </code><code>HttpClient httpClient = </code><code>new</code> <code>DefaultHttpClient();</code>

<code>           </code><code>String responseData = </code><code>""</code><code>;</code>

<code>           </code><code>try</code><code>{</code>

<code>               </code><code>//向指定的URL发送Http请求</code>

<code>               </code><code>HttpResponse response = httpClient.execute(</code><code>new</code> <code>HttpGet(urlStr));</code>

<code>               </code><code>//取得服务器返回的响应</code>

<code>               </code><code>HttpEntity entity = response.getEntity();</code>

<code>               </code><code>BufferedReader bufferedReader = </code><code>new</code> <code>BufferedReader(</code><code>new</code> <code>InputStreamReader(entity.getContent()));</code>

<code>               </code><code>String line = </code><code>""</code><code>;</code>

<code>               </code><code>while</code><code>((line = bufferedReader.readLine()) != </code><code>null</code><code>){</code>

<code>                   </code><code>responseData = responseData + line;</code>

<code>               </code><code>}</code>

<code>           </code><code>}</code>

<code>           </code><code>catch</code> <code>(Exception e) {</code>

<code>               </code><code>e.printStackTrace();</code>

<code>             </code><code>return</code> <code>responseData;</code>

<code>    </code><code>private</code> <code>String makeResults(String result){</code>

<code>        </code><code>String dealResult = result.substring(</code><code>0</code><code>, result.indexOf(</code><code>"result"</code><code>) +</code><code>8</code><code>) + </code><code>"["</code> <code>+ result.substring(result.indexOf(</code><code>"result"</code><code>) +</code><code>8</code><code>, result.length()-</code><code>1</code><code>) + </code><code>"]}"</code><code>;</code>

<code>        </code><code>return</code> <code>dealResult;</code>

<code>    </code><code>private</code> <code>String getLocation(String str){</code>

<code>          </code><code>JSONArray jsonObjs;</code>

<code>          </code><code>String location = </code><code>""</code><code>;</code>

<code>        </code><code>try</code> <code>{</code>

<code>             </code><code>jsonObjs = </code><code>new</code> <code>JSONObject(str).getJSONArray(</code><code>"result"</code><code>);</code>

<code>                </code><code>//取出数组中第一个json对象(本示例数组中实际只包含一个元素)</code>

<code>                </code><code>JSONObject jsonObj = jsonObjs.getJSONObject(</code><code>0</code><code>);</code>

<code>              </code><code>//解析得formatted_address值</code>

<code>              </code><code>String address = jsonObj.getString(</code><code>"formatted_address"</code><code>);</code>

<code>              </code><code>String bussiness = jsonObj.getString(</code><code>"business"</code><code>);</code>

<code>              </code><code>location = address + </code><code>":"</code> <code>+ bussiness;</code>

<code>        </code><code>} </code><code>catch</code> <code>(JSONException e) {</code>

<code>            </code><code>// TODO Auto-generated catch block</code>

<code>            </code><code>e.printStackTrace();</code>

<code>          </code><code>//取出数组中第一个json对象(本示例数组中实际只包含一个元素)</code>

<code>          </code><code>return</code> <code>location;</code>

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

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

activity_main.xml布局如下

<code>&lt;</code><code>RelativeLayout</code> <code>xmlns:android</code><code>=</code><code>"http://schemas.android.com/apk/res/android"</code>

<code>    </code><code>xmlns:tools</code><code>=</code><code>"http://schemas.android.com/tools"</code>

<code>    </code><code>android:layout_width</code><code>=</code><code>"match_parent"</code>

<code>    </code><code>android:layout_height</code><code>=</code><code>"match_parent"</code>

<code>    </code><code>tools:context</code><code>=</code><code>".MainActivity"</code> <code>&gt;</code>

<code>    </code><code>&lt;</code><code>TextView</code>

<code>        </code><code>android:id</code><code>=</code><code>"@+id/tv_loc_info"</code>

<code>        </code><code>android:layout_width</code><code>=</code><code>"wrap_content"</code>

<code>        </code><code>android:layout_height</code><code>=</code><code>"wrap_content"</code>

<code>        </code><code>android:layout_alignParentBottom</code><code>=</code><code>"true"</code>

<code>        </code><code>android:layout_alignParentLeft</code><code>=</code><code>"true"</code>

<code>        </code><code>android:layout_marginBottom</code><code>=</code><code>"130dp"</code>

<code>        </code><code>android:layout_marginLeft</code><code>=</code><code>"30dp"</code>

<code>        </code><code>android:text</code><code>=</code><code>"@string/hello_world"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>Button</code>

<code>        </code><code>android:id</code><code>=</code><code>"@+id/btn_start"</code>

<code>        </code><code>android:layout_above</code><code>=</code><code>"@+id/tv_loc_info"</code>

<code>        </code><code>android:layout_alignLeft</code><code>=</code><code>"@+id/tv_loc_info"</code>

<code>        </code><code>android:layout_marginBottom</code><code>=</code><code>"52dp"</code>

<code>        </code><code>android:text</code><code>=</code><code>"Button"</code> <code>/&gt;</code>

<code>&lt;/</code><code>RelativeLayout</code><code>&gt;</code>

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

<code>import</code> <code>android.app.Activity;</code>

<code>import</code> <code>android.os.Bundle;</code>

<code>import</code> <code>android.os.Handler;</code>

<code>import</code> <code>android.os.Message;</code>

<code>import</code> <code>android.view.View;</code>

<code>import</code> <code>android.view.View.OnClickListener;</code>

<code>import</code> <code>android.widget.Button;</code>

<code>import</code> <code>android.widget.TextView;</code>

<code>public</code> <code>class</code> <code>MainActivity </code><code>extends</code> <code>Activity {</code>

<code>    </code><code>private</code> <code>TextView locationInfoTextView = </code><code>null</code><code>;</code>

<code>    </code><code>private</code> <code>Button startButton = </code><code>null</code><code>;</code>

<code>                                                             </code> 

<code>    </code><code>MyBaiduLotion myLotion;</code>

<code>    </code><code>@Override</code>

<code>    </code><code>public</code> <code>void</code>  <code>onCreate(Bundle savedInstanceState) {</code>

<code>        </code><code>super</code><code>.onCreate(savedInstanceState);</code>

<code>        </code><code>setContentView(R.layout.activity_main);</code>

<code>                                                                 </code> 

<code>        </code><code>locationInfoTextView = (TextView) </code><code>this</code><code>.findViewById(R.id.tv_loc_info);</code>

<code>        </code><code>startButton = (Button) </code><code>this</code><code>.findViewById(R.id.btn_start);</code>

<code>        </code><code>startButton.setOnClickListener(</code><code>new</code> <code>OnClickListener() {</code>

<code>                                                                     </code> 

<code>            </code><code>@Override</code>

<code>            </code><code>public</code> <code>void</code> <code>onClick(View v) {</code>

<code>                </code><code>myLotion = </code><code>new</code> <code>MyBaiduLotion(MainActivity.</code><code>this</code><code>);</code>

<code>                </code><code>myLocation = </code><code>new</code> <code>MyLocation();</code>

<code>                </code><code>myLotion.opetateClient();</code>

<code>                </code><code>new</code> <code>LocationTHread().start();</code>

<code>    </code><code>class</code> <code>LocationTHread </code><code>extends</code> <code>Thread{</code>

<code>        </code><code>@Override</code>

<code>        </code><code>public</code> <code>void</code> <code>run() {</code>

<code>            </code><code>// TODO Auto-generated method stub</code>

<code>            </code><code>super</code><code>.run();</code>

<code>            </code><code>if</code><code>(myLotion != </code><code>null</code><code>)</code>

<code>            </code><code>while</code><code>(!myLotion.getIsFinish()){</code>

<code>                </code><code>try</code> <code>{</code>

<code>                    </code><code>sleep(</code><code>1000</code><code>);</code>

<code>                </code><code>} </code><code>catch</code> <code>(InterruptedException e) {</code>

<code>                    </code><code>// TODO Auto-generated catch block</code>

<code>                    </code><code>e.printStackTrace();</code>

<code>            </code><code>if</code><code>(myLotion.myBDcoordinate != </code><code>null</code><code>){</code>

<code>                </code><code>strlocation =  myLocation.getAddress(myLotion.getLatValue() +</code><code>""</code><code>, myLotion.getLongValue() + </code><code>""</code><code>);</code>

<code>                </code><code>myHandler.sendEmptyMessage(</code><code>1</code><code>);</code>

<code>    </code><code>Handler myHandler = </code><code>new</code> <code>Handler(){</code>

<code>        </code><code>public</code> <code>void</code> <code>handleMessage(Message msg) {</code>

<code>            </code><code>super</code><code>.handleMessage(msg);</code>

<code>            </code><code>locationInfoTextView.setText(strlocation);</code>

<code>    </code><code>};</code>

<code>    </code><code>protected</code> <code>void</code> <code>onDestroy() {</code>

<code>        </code><code>super</code><code>.onDestroy();</code>

<code>        </code><code>//myLotion.desClient();</code>

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

本文转自lilin9105 51CTO博客,原文链接:http://blog.51cto.com/7071976/1286797,如需转载请自行联系原作者

继续阅读