User Location的作用:
1.获取用户的位置
2.追踪用户的移动
User Location的关键API
1.Location Manager:用于管理Android的用户定位服务
2.Location Providers:提供多种定位方式供开发者选择。
<wbr><1>GPS Provider</wbr>
<wbr><2>Network Provider</wbr>
<3>Passive
定位方式的分类:
1.GPS定位:使用GPS卫星进行定位,需要在AndroidManifest.xml当中声明如下权限:
<wbr><wbr>android.permission.ACCESS_FINE_LOCATION</wbr></wbr>
2.NETWORK定位:使用信号接收塔和WIFI接入点进行定位,需要在AndroidManifest.xml当中声明如下权限:
<wbr><wbr>android.permission.ACCESS_FINE_LOCATION</wbr></wbr>
<wbr>或</wbr>
<wbr><wbr>android.permission.ACCESS_COARSE_LOCATION</wbr></wbr>
以上两种定位方式的区别是GPS定位精度更高,但同时也更耗电
获取用户的当前位置:
1.在AndroidManifest.xml当中声明相应的权限;
2.获取LocationManager对象;
3.选择LocationProvider;
4.绑定LocationListener对象。
LocationListener有四个方法:
1.onLocationChanged(Location location):当设备的位置发生改变时调用
<wbr><wbr>我们可以调用location.getLongitude()和location.getLatitude()来得到设备所处的经度和纬度</wbr></wbr>
2.onProviderDisabled(String provider):当提供数据Provider禁用时调用
3.onProviderEnabled(String provider):当提供数据的Provider使用时调用
4.onStatusChanged(String provider,int status,Bundle extras):当状态改变时
我们需要实现LocationListener的以上四个方法:
private class TestLocationListener implements LocationListener{
@Override
public void onLocationChanged(Location location){
System.out.println(location.getLongitude());
System.out.println(location.getLatitude());
}
@Override
public void onProviderDisabled(String provider){
// do something you need
}
@Override
public void onProviderEnabled(String provider){
// do something you need
}
@Override
public void onStatusChanged(String provider,int status,Bundle extras){
// do something you need
}
}
测试当前设备的LocationProvider
由于一般的设备存在不止一种定位方法,所以在这里给出查找定位服务的方法:
List<String> providers=locationManager.getAllProviders();
for(Iterator<String> iterator=providers.iterator();iterator.hasNext();){
String string=(String)iterator.next();
Log.d("BruceZhang", string+"\n");
由于有多个Provider,那么就需要做出选择,在这里给出选择最好的Provider的方法:
此时需要用到一个类--Criteria
下面是在Android SDK文档上给出的解释:
A
class indicating the application criteria for selecting a location provider. Providers maybe ordered according to accuracy, power usage, ability to report altitude, speed, and bearing, and monetary cost.
它提供了一系列的方法,设置用户的需求,并最终给出用户所需要的最佳的Provider,下面是文档上对设置条件的解释:
void setAccuracy(int accuracy)
Indicates the desired accuracy for latitude and longitude.
void setAltitudeRequired(boolean altitudeRequired)
Indicates whether the provider must provide altitude information.
void setBearingAccuracy(int accuracy)
Indicates the desired bearing accuracy.
void setBearingRequired(boolean bearingRequired)
Indicates whether the provider must provide bearing information.
void setCostAllowed(boolean costAllowed)
Indicates whether the provider is allowed to incur monetary cost.
void setHorizontalAccuracy(int accuracy)
Indicates the desired horizontal accuracy (latitude and longitude).
void setPowerRequirement(int level)
Indicates the desired maximum power level.
void setSpeedAccuracy(int accuracy)
Indicates the desired speed accuracy.
void setSpeedRequired(boolean speedRequired)
Indicates whether the provider must provide speed information.
void setVerticalAccuracy(int accuracy)
Indicates the desired vertical accuracy (altitude).
追踪用户的位置:
对用户的位置进行更新用到的方法和解释如下:
// public void requestLocationUpdates (String provider,
// long minTime, float minDistance, LocationListener listener)
// Added in API level 1
// Register for location updates using the named provider, and a pending intent.
//
// Parameters
// provider the name of the provider with which to register
// minTime minimum time interval between location updates, in milliseconds
// minDistance minimum distance between location updates, in meters
// listener a LocationListener whose onLocationChanged(Location) method will be called for each location update
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
0, new TestLocationListener());
下面,给出一个例子,实现用户的定位,取得支持的LocationProvider,根据条件获取最佳的Provider:
一下是实现的源代码:
public class MainActivity extends Activity {
private Button button;
private Button button2;
private Button button3;
private Button button4;
private LocationManager locationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.button1);
button2=(Button)findViewById(R.id.button2);
button3=(Button)findViewById(R.id.button3);
button4=(Button)findViewById(R.id.button4);
button.setOnClickListener(new ButtonListener());
button2.setOnClickListener(new ProviderButtonListener());
button3.setOnClickListener(new BestProviderButtonListener());
button4.setOnClickListener(new MyLocation());
locationManager=(LocationManager)MainActivity.this.
getSystemService(Context.LOCATION_SERVICE);
}
private class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// LocationManager locationManager=(LocationManager)MainActivity.this.
// getSystemService(Context.LOCATION_SERVICE);
/*
* 各个参数的意义:
* 1.定义当前所使用的Location Provider
* 2.位置更新一次的最小时间间隔
* 3.位置更新的最小距离
* 4.绑定监听器--位置发生变化会调用其中的方法
*/
Log.d("BruceZhang", "Bond Success");
// public void requestLocationUpdates (String provider,
// long minTime, float minDistance, LocationListener listener)
// Added in API level 1
// Register for location updates using the named provider, and a pending intent.
//
// Parameters
// provider the name of the provider with which to register
// minTime minimum time interval between location updates, in milliseconds
// minDistance minimum distance between location updates, in meters
// listener a LocationListener whose onLocationChanged(Location) method will be called for each location update
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
0, new TestLocationListener());
}
}
private class ProviderButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
List<String> providers=locationManager.getAllProviders();
for(Iterator<String> iterator=providers.iterator();iterator.hasNext();){
String string=(String)iterator.next();
Log.d("BruceZhang", string+"\n");
}
}
}
private class BestProviderButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Criteria criteria=new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setPowerRequirement(Criteria.POWER_LOW);
criteria.setAltitudeRequired(false);
criteria.setSpeedRequired(false);
criteria.setCostAllowed(false);
//第二个参数设置为false时,不管当前的那个provider是否可用,都需要进行查找,并根据条件设为最优
String provider=locationManager.getBestProvider(criteria, false);
Log.d("BruceZhang", "The best provider is:"+provider);
}
}
private class MyLocation implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//对用用户定位服务主要是中间两个参数的设置
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000,
2000, new TestLocationListener());
}
}
private class TestLocationListener implements LocationListener{
//这个函数的参数是用户当前的位置
@Override
public void onLocationChanged(Location arg0) {
// TODO Auto-generated method stub
// Toast.makeText(MainActivity.this, "您当前的经度是:"+arg0.getLongitude()+" ,"+
// "您当前的纬度是:"+arg0.getLatitude(),
// Toast.LENGTH_SHORT).show();
Log.d("BruceZhang", arg0.getLongitude()+"");
Log.d("BruceZhang", arg0.getLatitude()+"");
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
分享到:
相关推荐
Android Simple Location Tracker is an Android library that helps you get user location with a object named LocationTracker Installation Add this to your build.gradle file repositories { maven { url...
rk3229_获取ROOT权限补丁_...适用于Android 7.1 32位 root_tool5.1.zip---------->适用于Android 6.0/5.1 root.tar---------->适用于Android 4.4 RK3399_android7.1_root-------->适用于3399/3368等64位系统
Welcome to Android-Charts Welcome to Android-Charts project page on github.com. We just moved from Google Code. Android-Charts is an open-source android developing framework written in JAVA on Android...
Laravel开发-create-user-command 使用artisan命令创建用户
[14本经典Android开发教程] 9 Android2 3用户手册 已上传8本: [14本经典Android开发教程] 1 Android开发从入门到精通 http: download csdn net detail cleopard 8355245 [14本经典Android开发教程] 2 Android...
Android-LunarView A Chinese lunar calendar view. Screenshot Usage Use in xml: and you can add OnDatePickListener: lunarView.setOnDatePickListener(new LunarView.OnDatePickListener() { @Override ...
rk3566-box-demo-android11-RTL8822CS调试
Laravel开发-module-user 用户模块
Laravel开发-l5-user-role-and-permission Laravel 5的用户角色和权限服务提供商
Laravel开发-l5-user-action Laravel 5的用户操作服务提供商
Laravel开发-user-agent-for-laravel5 基于浏览器/分析器的Laravel5的UserAgent分析器包
Laravel开发-laravel-user-permissions Laravel用户权限包
Laravel开发-user-ratings 将用户评级添加到Laravel 5.1雄辩模型中。
[14本经典Android开发教程]-11-Android系统移植技术详解 -------------------------------------------------- (1)安装如下软件包 sudo apt-get install git-core sudo apt-get install gnupg sudo apt-get install...
Laravel开发-user-privilege-mapper 一个Laravel服务提供者,用于独立于用户模型实现处理可用用户安全权限的测试
[14本经典Android开发教程]-4-Android应用程序开发36技 本书共分为4篇: ※ 第一篇:介绍应用框架概念、原理和特性。 ※ 第二篇:阐述应用框架之设计技巧。亦即,如何打造应用框架。 (注:如果你的职务是「使用」...
[14本经典Android开发教程]-7-Android编程入门教程 -------------------------------------------------- 本文为以前已经使用Java编程并想开始为Android平台开发的开发者编写。我试着尽可能地多的"展开",在合适的每...
Laravel开发-laravel-make-user 用于在Laravel应用程序中创建用户的Artisan控制台命令。
Laravel开发-laravel-user-blockable Laravel 5用户块系统
[14本经典Android开发教程]-3-Android SDK 中文开发文档 什么是 Android? Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。Beta版的 Android SDK 提供了在Android 平台上...