在开发时候,我们定位城市信息通常都使用系统的GPS service来定位,或者直接使用网络定位,最终获取经经纬度。最后通过获取的经纬度去请求第三方的API获取具体的城市名称,如百度的”http://api.map.baidu.com/geocoder”。 上面的做法有个缺点,就是在使用GPS SERVICE的时候,有时候获取不到经纬度。
这里我们使用百度的地图定位sdk来实现直接获取城市的实现方法。
使用百度地图API的locSDK,直接在官网下载相关版本的SDK。然后做下面的配置:
1.把下载SDK放到libs目录下并且右键这个SDK文件,然后点击添加的build path 中。
2.在libs下创建armeabi文件目录,然后把baidumapapi解压出来的liblocSDK3.so 放到armeabi目录下。
3.在项目的mainfest 配置文件中添加权限配置如下:
1
2
3
4
5
6
7
8
9
|
<
uses
-
permission
android
:
name
=
"android.permission.READ_LOGS"
/
>
<
uses
-
permission
android
:
name
=
"android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
/
>
<
uses
-
permission
android
:
name
=
"android.permission.READ_PHONE_STATE"
/
>
<
uses
-
permission
android
:
name
=
"android.permission.CHANGE_WIFI_STATE"
/
>
<
uses
-
permission
android
:
name
=
"android.permission.ACCESS_NETWORK_STATE"
/
>
<
uses
-
permission
android
:
name
=
"android.permission.ACCESS_WIFI_STATE"
/
>
<
uses
-
permission
android
:
name
=
"android.permission.ACCESS_COARSE_LOCATION"
/
>
<
uses
-
permission
android
:
name
=
"android.permission.INTERNET"
/
>
<
uses
-
permission
android
:
name
=
"android.permission.ACCESS_FINE_LOCATION"
/
>
|
4.加上百度Android的service配置:
1
2
3
4
|
<
service
android
:
name
=
"com.baidu.location.f"
android
:
enabled
=
"true"
android
:
process
=
":remote"
>
|
下面来讲解下代码实现
创建地址监听器,这个监听器继承自百度SDK中的BDLocationListener,这个监听器的作用就是用来监听通过百度Service获取的地址信息,然后解析地址信息,把相关的地址相关信息呈现出来,例如显示在界面上。具体写法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public
class
CoolbeetleLocationListener
implements
BDLocationListener
{
@
Override
public
void
onReceiveLocation
(
BDLocation
location
)
{
if
(
location
!=
null
)
{
StringBuffer
sb
=
new
StringBuffer
(
128
)
;
sb
.
append
(
location
.
getCity
(
)
)
;
//获取称帝
currentCity
=
sb
.
toString
(
)
.
trim
(
)
;
if
(
currentCity
!=
null
&&
!
currentCity
.
equals
(
"null"
)
)
{
locate_txt
.
setText
(
currentCity
)
;
}
else
{
locate_txt
.
setText
(
"未获取"
)
;
}
requestWeather
(
)
;
}
else
{
locate_txt
.
setText
(
"未获取"
)
;
return
;
}
}
@
Override
public
void
onReceivePoi
(
BDLocation
arg0
)
{
}
|
有了这个Listener之后,我们来创建出发地址请求的Client:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
LocationClient
locationClient
=
null
;
public
BDLocationListener
myListener
=
new
CoolbeetleLocationListener
(
)
;
locationClient
=
new
LocationClient
(
this
.
getActivity
(
)
.
getApplicationContext
(
)
)
;
// 声明LocationClient类
locationClient
.
registerLocationListener
(
myListener
)
;
LocationClientOption
option
=
new
LocationClientOption
(
)
;
option
.
setOpenGps
(
true
)
;
option
.
setAddrType
(
"all"
)
;
option
.
setCoorType
(
"bd09ll"
)
;
option
.
setScanSpan
(
3000
)
;
option
.
disableCache
(
false
)
;
option
.
setPriority
(
LocationClientOption
.
NetWorkFirst
)
;
// 网络定位优先
locationClient
.
setLocOption
(
option
)
;
// 使用设置
locationClient
.
start
(
)
;
// 开启定位SDK
locationClient
.
requestLocation
(
)
;
// 开始请求位置
|
这个Client的配置参数见上面代码,如果需要了解更多可以查询百度地图开发的相关文档。
上面的请求代码可以直接放在Activity或者Fragement的onCreate 方法中来使用。
记得在Activity或者Fragment的onDestroy方法中加上关闭请求的代码实现:
1
2
3
4
5
|
if
(
locationClient
!=
null
&&
locationClient
.
isStarted
(
)
)
{
locationClient
.
stop
(
)
;
//关闭百度定位
locationClient
=
null
;
}
|