android 基于GPS或网络定位学习(LocationManager)

[size=medium][b]1.定位概念[/b][/size]
在Android系统上实现定位主要是通过[color=red]GPS[/color]或者是[color=red]基于网络[/color]的定位方法。

[color=red]GPS是精度最高的,但是它只在户外有用,并且很耗电,并且首次定位花费时间较长。[/color]

[b]基于网络的定位利用通信网络蜂窝基站和Wi-Fi信号[/b],这种定位方式在室内室外都能用,响应时间较短,耗电较少,[color=red]但是精度较差[/color]。

为了在应用中获得用户的信息,你的[color=red]LocationProvider可以是GPS或者基于网络[/color],也可以两者都用。

[size=medium][b]2.请求位置更新[/b][/size]
在Android中获取位置主要是通过[color=red]回调函数LocationListener[/color]。

首先通过LocationManager的 [color=red]requestLocationUpdates()[/color]方法注册监听器,向其中传入一个实现了[color=red]LocationListener[/color]接口的对象。

你的 LocationListener对象中必须实现一些回调函数,当用户位置改变或者当服务状态改变时,LocationManager就会调用这些回调函数。

requestLocationUpdates()中的[color=red]第一个参数[/color]指明了LocationProvider的类型,[color=red]第二个参数[/color]是位置刷新时间间隔,[color=red]第三个参数[/color]是通知的最小的改变距离。

[b]如果第二个和第三个参数都设置成0就表示要尽可能频繁地请求位置通知。[/b]

最后一个参数是用户自己定义的实现了[color=red]LocationListener[/color]接口的对象,它接收位置更新的回调。

如果想要同时利用GPS和网络定位,[color=red]可以调用requestLocationUpdates()两次[/color],第一个参数分别是[color=red]GPS_PROVIDER和 NETWORK_PROVIDER。[/color]

[size=medium][b]3.权限设置[/b][/size]
如果没有权限设置,程序在请求位置更新时将会失败。
// 对应网络定位

// 对于GPS定位


[color=red]如果用NETWROK_PROVIDER, 那么需要声明 ACCESS_COARSE_LOCATION和INTERNET[/color]

[color=red]如果用GPS_PROVIDER, 那么需要声明 ACCESS_FINE_LOCATION[/color]

[b]ACCESS_FINE_LOCATION是包含了ACCESS_COARSE_LOCATION的,所以两者都用时可以只声明ACCESS_FINE_LOCATION。[/b]

[size=medium][b]4.Criteria用于查找最优Provider[/b][/size]
应用程序可能需要获得最优的Provider,所以需要使用过滤条件Criteria 通过[color=red]LocationManageer.getBestProvider(Criteria Criteria,boolean)[/color]来获取。
Criteria中的每个方法都是一个过滤条件


[size=medium][b]5.例子[/b][/size]


package com.test.activity;

import android.app.Activity;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;

import com.test.R;
/**
* 定位例子
*/
public class LocationActivity extends Activity implements LocationListener {

private LocationManager locationManager;
private TextView tvOutput;
private String best;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainactivity);
// 从系统服务中获得位置管理器
locationManager = (LocationManager) this
.getSystemService(LOCATION_SERVICE);
tvOutput = (TextView) findViewById(R.id.location);
// 获取最好的provider
getBestProvider();
// 获取最近信息
Location location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
showLocationInfo(location);
// 每三秒刷新一次位置
locationManager.requestLocationUpdates(best, 3000, 8, this);
}
private void getBestProvider(){
// 定义规则 用于查找最适合的Criteria
Criteria criteria = new Criteria();
// 免费的
criteria.setCostAllowed(false);
// 精确要求
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// 获得最合适的提供者
best = locationManager.getBestProvider(criteria, true);
}
// 显示位置信息
public void showLocationInfo(Location location) {
StringBuffer sb = new StringBuffer("");
if (location != null) {
sb.append("\n 经度:" + location.getLongitude());
sb.append("\n 纬度:" + location.getLatitude());
}
tvOutput.setText(sb.toString());
}

// 位置改变时获得坐标
@Override
public void onLocationChanged(Location location) {
showLocationInfo(location);
}

// 暂停时删除更新位置
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}

// 恢复时请求更新位置
@Override
protected void onResume() {
super.onResume();
}

@Override
public void onProviderDisabled(String arg0) {
showLocationInfo(null);
}

@Override
public void onProviderEnabled(String provider) {
showLocationInfo(locationManager.getLastKnownLocation(provider));
}

@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {

}
}


你可能感兴趣的:(android)