使用Android自带的LocationManager和Location获取位置的时候,经常会有获取的location为null的情况,并且操作起来也不是很方便,在这个Demo里我使用了百度地图API中的定位SDK,可以一次性获取当前位置经纬度以及详细地址信息,还可以获取周边POI信息,同时可以设定位置通知点,当到达某一位置时,发出通知信息等方式来告知用户。jar包下载以及官方文档请参照:百度定位SDK,前提是需要注册百度开发者账号。
下面来看看定位的基本原理,目前,定位SDK可以通过GPS、基站、Wifi信号进行定位。基本定位流程如下图所示,当应用程序向定位SDK发起定位请求时,定位SDK会根据当前的GPS、基站、Wifi信息生成相对应的定位依据。然后定位SDK会根据定位依据来进行定位。如果需要,定位SDK会向定位服务器发送网络请求。定位服务器会根据请求的定位依据推算出对应的坐标位置,然后根据用户的定制信息,生成定位结果返回给定位SDK。
到官方下载jar文件后添加到工程,工程目录截图如下:
注意要把locSDK_2.4.jar添加到当天工程,右键jar文件-Build path-Add to。。。
上代码
布局文件:
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
LinearLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
android:orientation
=
"vertical"
>
<
Button
android:id
=
"@+id/btn_start"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:layout_marginTop
=
"20dp"
android:text
=
"Start"
/>
<
TextView
android:id
=
"@+id/tv_loc_info"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:textSize
=
"18sp"
/>
</
LinearLayout
>
配置文件:
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
manifest
xmlns:android
=
"http://schemas.android.com/apk/res/android"
package
=
"com.ericssonlabs"
android:versionCode
=
"1"
android:versionName
=
"1.0"
>
<
uses-sdk
android:minSdkVersion
=
"8"
/>
<
permission
android:name
=
"android.permission.BAIDU_LOCATION_SERVICE"
>
</
permission
>
<
uses-permission
android:name
=
"android.permission.BAIDU_LOCATION_SERVICE"
>
</
uses-permission
>
<
uses-permission
android:name
=
"android.permission.ACCESS_COARSE_LOCATION"
>
</
uses-permission
>
<
uses-permission
android:name
=
"android.permission.ACCESS_FINE_LOCATION"
>
</
uses-permission
>
<
uses-permission
android:name
=
"android.permission.ACCESS_WIFI_STATE"
>
</
uses-permission
>
<
uses-permission
android:name
=
"android.permission.ACCESS_NETWORK_STATE"
>
</
uses-permission
>
<
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"
/>
<
uses-permission
android:name
=
"android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
>
</
uses-permission
>
<
uses-permission
android:name
=
"android.permission.READ_LOGS"
>
</
uses-permission
>
<
application
android:icon
=
"@drawable/ic_launcher"
android:label
=
"@string/app_name"
>
<
activity
android:name
=
".LocationDemoActivity"
android:label
=
"@string/app_name"
>
<
intent-filter
>
<
action
android:name
=
"android.intent.action.MAIN"
/>
<
category
android:name
=
"android.intent.category.LAUNCHER"
/>
</
intent-filter
>
</
activity
>
<
service
android:name
=
"com.baidu.location.f"
android:enabled
=
"true"
android:permission
=
"android.permission.BAIDU_LOCATION_SERVICE"
android:process
=
":remote"
>
<
intent-filter
>
<
action
android:name
=
"com.baidu.location.service_v2.4"
/>
</
intent-filter
>
</
service
>
</
application
>
</
manifest
>
实现代码:
public
class
LocationDemoActivity
extends
Activity {
private
TextView locationInfoTextView =
null
;
private
Button startButton =
null
;
private
LocationClient locationClient =
null
;
private
static
final
int
UPDATE_TIME =
5000
;
private
static
int
LOCATION_COUTNS =
0
;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
locationInfoTextView = (TextView)
this
.findViewById(R.id.tv_loc_info);
startButton = (Button)
this
.findViewById(R.id.btn_start);
locationClient =
new
LocationClient(
this
);
//设置定位条件
LocationClientOption option =
new
LocationClientOption();
option.setOpenGps(
true
);
//是否打开GPS
option.setCoorType(
"bd09ll"
);
//设置返回值的坐标类型。
option.setPriority(LocationClientOption.NetWorkFirst);
//设置定位优先级
option.setProdName(
"LocationDemo"
);
//设置产品线名称。强烈建议您使用自定义的产品线名称,方便我们以后为您提供更高效准确的定位服务。
option.setScanSpan(UPDATE_TIME);
//设置定时定位的时间间隔。单位毫秒
locationClient.setLocOption(option);
//注册位置监听器
locationClient.registerLocationListener(
new
BDLocationListener() {
@Override
public
void
onReceiveLocation(BDLocation location) {
// TODO Auto-generated method stub
if
(location ==
null
) {
return
;
}
StringBuffer sb =
new
StringBuffer(
256
);
sb.append(
"Time : "
);
sb.append(location.getTime());
sb.append(
"\nError code : "
);
sb.append(location.getLocType());
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){
sb.append(
"\nSpeed : "
);
sb.append(location.getSpeed());
sb.append(
"\nSatellite : "
);
sb.append(location.getSatelliteNumber());
}
else
if
(location.getLocType() == BDLocation.TypeNetWorkLocation){
sb.append(
"\nAddress : "
);
sb.append(location.getAddrStr());
}
LOCATION_COUTNS ++;
sb.append(
"\n检查位置更新次数:"
);
sb.append(String.valueOf(LOCATION_COUTNS));
locationInfoTextView.setText(sb.toString());
}
@Override
public
void
onReceivePoi(BDLocation location) {
}
});
startButton.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
if
(locationClient ==
null
) {
return
;
}
if
(locationClient.isStarted()) {
startButton.setText(
"Start"
);
locationClient.stop();
}
else
{
startButton.setText(
"Stop"
);
locationClient.start();
/*
*当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。
*调用requestLocation( )后,每隔设定的时间,定位SDK就会进行一次定位。
*如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,
*返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。
*定时定位时,调用一次requestLocation,会定时监听到定位结果。
*/
locationClient.requestLocation();
}
}
});
}
@Override
protected
void
onDestroy() {
super
.onDestroy();
if
(locationClient !=
null
&& locationClient.isStarted()) {
locationClient.stop();
locationClient =
null
;
}
}
}
来看看最后实现效果,点击Start后进入位置监听状态,根据设置的监听时间间隔进行定位,如果位置有变化则进行位置更新,同时显示了检测位置更新的次数,如果开启了GPS,则获取到卫星后,进行GPS定位:
相关推荐
这是我将百度地图定位经纬度部分截取出来的部分,是官方提供demo的一个简单化,只有经纬度信息,为了方便定位使用,当时我也就是需要这两个信息,所以封装了一下获取经纬度的代码,请看清楚后下载;
在运行的时候要注意百度SDK的百度key效验问题,如果key效验不成功只能获得默认的位置
使用百度定位SDK获取GPS数据并上传到数据库,获得的坐标为百度坐标系坐标,若要在其他地图上使用需要进行相应转换。 百度定位SDK锁屏后无法定位问题的解决,是使用了一个AlarmManager每隔10秒发送一个PendingIntent...
Android 百度地图最新SDK v3.2.0和Android定位SDK:v5.0应用,博客中有详细介绍
百度Android 定位SDK v4.0
高德 开发 Android 定位SDK 开发指南 获取位置 获取定位数据
使用百度定位SDK获取当前位置的经度纬度信息 部分代码片段如下: public static void locate(Application application) { // 定位服务 LocationClient mLocClient = ((Location)application)....
获取经纬度已经封装成工具类,纯原生获取android手机经纬度,并且根据经纬度转换成准确的地址
Android下利用百度地图定位SDK实现的在后台实时获取地理位置信息的例子,可以运行,希望对你有所帮助。
安卓 android 百度地图 SDK GPS 位置获取 位置地图显示
Android 百度地图最新SDK v3.2.0和Android定位SDK:v5.0应用,http://blog.csdn.net/yalinfendou/article/details/43307391博客中有详细介绍……
Android原生方式获取经纬度两种定位方式:GPS定位和Wifi定位 GPS定位相比Wifi定位更精准且可在无网络情况下使用,但在室内基本暴毙无法使用。 WiFi定位没有室内外限制,也不需要开启GPS但需要联网。但测试发现W
java定位 尝试百度定位SDK Android 经纬度获取
1)创建项目,上传应用到百度定位sdk获得应用对应key,并配置定位服务成功。 2)将配置的定位代码块放入service中,使程序在后台不断更新经纬度 3)为应用创建数据库和相应的数据表,编写 增删改查 业务逻辑方法 4)...
本插件是cordova-qdc-baidu-location的升级版,利用百度定位SDK为Web app解决大陆Android定位不准的问题。 相比原插件,更新百度地图Android版定位SDK(v6.2.3)并提供watchPosition和clearWatch方法。
* 百度Android定位SDK自v7.0版本起,按照附加功能不同,向开发者提供了四种不同类型的定位开发包,可根据不同需求下载不同的开发包 * ----这里使用了其中的基准定位 开发包也才几百k 没有担心apk 突然增大很多的...
Android 定位 SDK v7.5 中的全量定位开发包。包括离线版本类参考、示例代码、开发包(全量定位开发包,即包含基础定位能力、离线定位能力、高精度室内定位能力的开发包
google地图SKD使用和google定位SDK使用
Android 基于百度定位sdk ,获取城市,使用json解析天气, 根据天气类型 显示图标
Android定位,基于百度基础定位sdk封装。可直接使用