Android应用程序实现定位功能 | 使用百度定位SDK

Android应用程序实现定位功能 | 使用百度定位SDK

简介

Android应用程序如果能够记录用户位置信息会为应用程序增添不少价值。Android应用实现定位功能有两种方式:使用Android系统API的LocationManager、Location类或者使用第三方SDK实现定位功能。然而Android系统API定位功能getLastKnownLocation(String provider)往往返回null(可能是因为系统API使用Google地图服务实现定位,而Google服务在国内不好使)。在国内百度也有提供定位服务,而且响应的SDK也在不断更新,因此在国内开发应用程序使用百度定位SDK实现定位功能是个不错的选择(可恶的是SDK说明太简陋了)。

定位大致原理:应用程序设置参数并请求百度定位SDK,百度定位SDK获取手机当前定位依据(如WIFI,GSM,GPS信息等),并使用此依据像百度后台地图服务发出定位请求,请求成功后百度定位SDK会调用应用注册的回调接口以便通知应用。

接口

要使用百度定位SDK实现应用程序定位功能需要开发者注册百度开发者账号并为应用程序注册申请AccessKey(详细说明请参见 http://developer.baidu.com/map/index.php?title=android-locsdk),并下载响应SDK。

如果仅实现定位功能,主要需要以下三个接口:LocationClient、LocationClientOption、BDLocationListener、BDLocation 。

BDLocation 为位置类,包含纬度、经度、精度等等

LocationClient为定位服务客户端类,是定位SDK核心类,它负责发送定位请求,通知定位结果等,定位相关操作是在后台线程执行的。

LocationClientOption为LocationClient使用的定位选项,定义了请求的一些详细信息,比如定位模式、定位请求时间间隔、是否获取地址信息等等。

BDLocationListener为定位回调接口,此接口有一个方法onReceiveLocation(BDLocation location),此接口注册给LocationClient对象上,在每次定位后此方法会被调用(在主线程中调用)。

示例

说明:

本示例通过百度定位SDK实现Android应用程序的定位功能,并将定位结果展示。

注意:

在Manifest.xml配置文件application标签内定义 定位服务和定义元数据name/value,百度定位SDK使用次元数据作为请求时的ak。

<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>

<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="key为自己应用申请的key" />

为应用程序申请相应权限

<!-- 这个权限用于进行网络定位--><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>

activity布局文件

res/layout/activity_locationtest.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:andro
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:orientation="vertical" >
<Button
android:
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="@drawable/selector_bg_rectangle_gray123"
android:gravity="center"
android:text="开始定位"
android:textColor="@android:color/black" />
<TextView
android:
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="center"
android:text="定位结果?" />
</LinearLayout>

activity文件

com/example/fxgandroid/locationtest/LocationTestActivity.java


import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;


import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.example.fxgandroid.R;


public class LocationTestActivity extends Activity {
// Views
private Button btnGetLocation;
private TextView txvLoation;
// 百度APIS
private LocationClient mLocationClient; // 百度定位客户端
private BDLocationListener mLocationListener; // 百度位置监听接口,LocationClient每次成功定位后此接口都会被调用
private LocationClientOption mLocationClientOption;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_locationtest);
initView();
initListener();
}
private void initBDApi() {
//
mLocationClient = new LocationClient(getApplicationContext());
mLocationClientOption = initLocationClientOption();
mLocationClient.setLocOption(mLocationClientOption);
//
mLocationListener = new MLocationListener();
mLocationClient.registerLocationListener(mLocationListener);
//
mLocationClient.start();
int state = mLocationClient.requestLocation();
// Log.e("requestLocation", "state = "+state);
}


private LocationClientOption initLocationClientOption() {
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
return option;
}
private void initView() {
btnGetLocation = (Button) findViewById(R.id.btn_getlocation);
txvLoation = (TextView) findViewById(R.id.txv_location);
}
private void initListener() {
btnGetLocation.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
initBDApi();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mLocationClient !=null &&mLocationListener!=null){
mLocationClient.unRegisterLocationListener(mLocationListener);
}
if( mLocationClient.isStarted()){
mLocationClient.stop();
}
}
class MLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
StringBuffer locInfo = new StringBuffer();
locInfo.append("定位时间:"+location.getTime());
locInfo.append("error code:"+location.getLocType());
locInfo.append("纬度:"+location.getLatitude());
locInfo.append("经度:"+location.getLongitude());
locInfo.append("定位精度:"+location.getRadius());
if(location.getLocType() == BDLocation.TypeGpsLocation){
locInfo.append("速度:"+location.getSpeed());
locInfo.append("satellite:");
locInfo.append(location.getSatelliteNumber());
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
locInfo.append("addr : ");
locInfo.append(location.getAddrStr());
}
showLocationInfo(locInfo);
}
}
public void showLocationInfo(StringBuffer locInfo) {
txvLoation.setText(locInfo);
}
}

效果截图

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部