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。 
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
       
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="key为自己应用申请的key" />

为应用程序申请相应权限


<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" />
—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

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:orientation="vertical" >
   

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("\nerror code:"+location.getLocType());
locInfo.append("\n纬度:"+location.getLatitude());
locInfo.append("\n经度:"+location.getLongitude());
locInfo.append("\n定位精度:"+location.getRadius());
if(location.getLocType() == BDLocation.TypeGpsLocation){
locInfo.append("\n速度:"+location.getSpeed());
locInfo.append("\nsatellite:");
locInfo.append(location.getSatelliteNumber());
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
locInfo.append("\naddr : ");
locInfo.append(location.getAddrStr());
}
showLocationInfo(locInfo);
}
}
public void showLocationInfo(StringBuffer locInfo) {
txvLoation.setText(locInfo);
}
}

效果截图

Android应用程序实现定位功能(使用百度定位SDK)_第1张图片   Android应用程序实现定位功能(使用百度定位SDK)_第2张图片

你可能感兴趣的:(Android)