API
- LocationManager: 用于管理Android的用户定位服务
- LocationProvider:提供多种定位方式供开发者选择
- 使用GPS定位:权限:android.permission.ACCESS_FINE_LOCATION
- NETWORK定位:使用信号接受塔和wifi接入点进行定位:权限:android.permission.ACCESS_FINE_LOCATION或者android.permission.ACCESS_COARSE_LOCATION(粗糙定位)、
步骤
- 声明相应权限
- 获取locationManager对象
- 选择LocationProvider
- 绑定LocationListener
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TestLocationlistener listener = new TestLocationlistener();
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//getSystemService():获取系统服务返回一个object,向下转型
LocationManager locationManager = (LocationManager) MainActivity.this.getSystemService(Context.LOCATION_SERVICE);
//1.定义当前所使用的provider类型,2发出通知的间隔的最小时间,更新位置间隔3两次定位之间的最小距离4监听器
locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER, 0, 0, listener);
}
});
}
private class TestLocationlistener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
Log.d("location", location.getLongitude() + "");
Log.d("location", location.getAltitude() + "");
}
//当位置提供者LocationProvider定位方式状态改变,当不能够获取位置信息或者由不能获取转为 //能获取状态时调用
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderDisabled(String s) {
}
@Override
public void onProviderEnabled(String s) {
}
}
}
LocationProvider
- 显示当前的设备有哪些可以用的provider
- 选择最好的provider
06-24 09:41:12.915 7095-7095/? D/location: gps
06-24 09:41:12.915 7095-7095/? D/location: network
//查的结果好像是记录的手机到过的位置信息
06-24 09:41:12.915 7095-7095/? D/location: local_database
Criteria(标准)
- 创建一个Criteria对象
- 设置Criteria
使用getBestProvider()方法选出最好的provider
setAccuracy(int accuracy)
Indicates the desired accuracy for latitude and longitude.设置精度
setAltitudeRequired(boolean altitudeRequired)
Indicates whether the provider must provide altitude information.
是否需要海拔信息
setBearingAccuracy(int accuracy)
Indicates the desired bearing accuracy.获取方向精度:
getHorizontalAccuracy()
Returns a constant indicating the desired horizontal accuracy (latitude and longitude).
很多建议自己查文档
chooseLocationProvider.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//生成一个Criteria对象
Criteria criteria = new Criteria();
//设置查询条件
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
criteria.setAltitudeRequired(false);
criteria.setSpeedRequired(false);
criteria.setCostAllowed(false);
//获得最好的provider,如果是true的话仅返回当前已经打开的provider中查找
String provider = locationManager.getBestProvider(criteria, false);
if (provider == null) {
Log.d("location", "找不到对应的locationProvider");
}
else {
Log.d("location", provider);
}
}
});
追踪用户位置
//getSystemService():获取系统服务返回一个object,
//下转型
LocationManager locationManager = (LocationManager) MainActivity.this.getSystemService(Context.LOCATION_SERVICE);
//1.定义当前所使用的provider类型,2发出通知的间隔的最小时 //间,更新位置间隔即最短更新位置时间3两次定位之间的最小 //距离即最短更新距离4监听器
/*主要根据这个方法追踪用户位置
* */
locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER, 5000, 5000, listener);
Geocoding介绍
根据经纬度查询街道和城市,根据位置查询街道
1. 查询某地址经纬度
2. 查询某经纬度的具体地址
步骤(有bug)
- 创建一个GeoCoder对象
- 调用该对象的getFromLocation()或者是getFromLocationMame()方法;
3.建议采用第一行代码11.3.1节用法