用户定位
一、简单的UserLocation
1、UserLocation用来干什么
获取用户位置,追踪用户移动
2、UserLocation的关键API
LocationManager: 用于管理定位的服务
LocationProvider:提供定位方式,GPS/NetWork/passive
3、定位方式
A、使用GPS卫星,需要在AndroidMenifest中声明权限
android.permission.ACCESS_FINE_LOCATION 这是一个比较精确的定位
B、NetWork,用信号接收塔和WiFi接入点,需要在AndroidMenifest中声明权限
android.permission.ACCESS_COARSE_LOCATION 这是一个不很精确的定位
或者
android.permission.ACCESS_FINE_LOCATION
4、获取当前位置的步骤
A、在AndroidMenifest中声明权限
B、获取LocationManager(获取定位服务)
LocationManager locationManager=(LocationManager)MainActivity.this.getSystemService(Context.LOCATION_SERVICE)
C、选择LocationProvider(选择定位方式)
D、绑定一个LocationListnener对象,当用户位置发生改变时,会触发监听器
//第一个参数是定位的方式,第二个参数是定位的周期(单位ms)
//第三个参数是定位的距离,每隔多少米定位一次
//第四个参数是监听器
locationManager.requestLocationUpdates(LocationMnager.GPS_PROVIDER, 0, 0, new testLocationListener)
5、LocationListener的四个方法
A、onLocationChanged,当用户位置发生改变时调用该方法
B、onProviderDisabled,当提供数据的provider不能使用时调用该方法
C、onProviderEnabled,当提供数据的provider可以使用时调用该方法
D、onStatusChanged,当提供数据的provider发生改变时调用该方法
6、Android模拟器可以模拟定位服务,启动Eclipse的DDMS视图,可以发送经度和纬度到模拟器
二、选择最佳定位方式,追踪位置
1、得到所有的LocationProvider
LocationManager.getAllProviders(),将结果打印出来可以知道有三种定位方式GPS/NetWork/passive
2、Android通过Criteria来设置一系列的查询条件,用于查询符合条件的LocationProvider
Criteria criteria = new Criteria()
所谓最佳定位方式,就是满足当前设定条件的定位方式,Criteria可以设定的条件有
(1)、criteria.setAccuracy(int accuracy)
设置定位的精确度,有两种取值ACCURACY_COARSE(精确度不太高) ACCURACY_FINE(精确度高)
(2)、criteria.setAltitudeRequired(boolean altitudeRequired)
设置是否需要测试海拔,TRUE/FALSE
(3)、criteria.setBearingRequired(boolean bearingRequired)
设置是否需要获取方向
(4)、criteria.setBearingAccuracy(int bearingAccuracy)
设置获取方向的精度,取值ACCURACY_HIGN/ACCURACY_LOW
(5)、criteria.setCostAllowed(int costAllowed)
设置是否可以发生收费现象
(6)、criteria.setHorizontalAccuracy(int accuracy)
设置水平方向的精度,取值 ACCURACY_HIGN/ACCURACY_LOW/ACCURACY_MEDIUM
(7)、criteria.setVerticalAccuracy(int accuracy)
设置垂直方向的精度,取值 ACCURACY_HIGN/ACCURACY_LOW/ACCURACY_MEDIUM
(8)、criteria.setPowerRequirement(int level)
设置电量消耗的级别,取值PEWER_LOW/POWER_MEDIUM/POWER_HIGH
(9)、criteria.setSpeedRequired(boolean speedRequired)
设置是否需求速度
(10)、criteria.setSpeedAccuracy(int accuracy)
设置速度的精度,取值ACCURACY_HIGN/ACCURACY_LOW/ACCURACY_MEDIUM
3、获取最佳定位方式
//第一个参数是当前设置的条件
//第二个参数是false,会查询当前所有的定位方式;第二个参数真true,查询已经打开的定位方式
locationManager.getBestProvider(criteria, false)
三、源代码
MainActivity.java
此处)折叠或打开
1. package com.example.location;
2.
3. import java.util.Iterator;
4. import java.util.List;
5.
6. import android.location.Criteria;
7. import android.location.Location;
8. import android.location.LocationListener;
9. import android.location.LocationManager;
10. import android.os.Bundle;
11. import android.app.Activity;
12. import android.content.Context;
13. import android.content.DialogInterface;
14. import android.content.DialogInterface.OnClickListener;
15. import android.view.Menu;
16. import android.view.View;
17. import android.widget.Button;
18.
19. public class MainActivity extends Activity {
20.
21. private Button getLocationBtn = null;
22. private Button getBestProviderBtn = null;
23. private Button getAllProviderBtn = null;
24. private LocationManager locationManager = null;
25.
26. Override
27. protected void onCreate(Bundle savedInstanceState) {
28. super.onCreate(savedInstanceState);
29. (R.layout.activity_main);
30.
31. //获取按钮
32. = (Button)findViewById(R.id.getLocationBtn);
33. = (Button)findViewById(R.id.getAllProviderBtn);
34. = (Button)findViewById(R.id.getBestProviderBtn);
35. //为按钮绑定监听器
36. .setOnClickListener(new btnListener());
37. .setOnClickListener(new btnListener());
38. .setOnClickListener(new btnListener());
39.
40. //获取LocationManager(获取定位服务)
41. =(LocationManager)MainActivity.this.getSystemService(Context.LOCATION_SERVICE);
42. }
43.
44. class testLocationListener implements LocationListener
45. {
46.
47. Override
48. public void onLocationChanged(Location location)
49. {
50. // TODO Auto-generated method stub
51. //打印出纬度
52. System.out.println(location.getLatitude());
53. //打印出经度
54. System.out.println(location.getLongitude());
55. }
56.
57. Override
58. public void onProviderDisabled(String provider)
59. {
60. // TODO Auto-generated method stub
61.
62. }
63.
64. Override
65. public void onProviderEnabled(String provider)
66. {
67. // TODO Auto-generated method stub
68.
69. }
70.
71. Override
72. public void onStatusChanged(String provider, int status, Bundle extras)
73. {
74. // TODO Auto-generated method stub
75.
76. }
77.
78. }
79.
80. class btnListener implements android.view.View.OnClickListener
81. {
82. Override
83. public void onClick(View v)
84. {
85. // TODO Auto-generated method stub
86. switch(v.getId())
87. {
88. case R.id.getAllProviderBtn:
89. ListString> providers = locationManager.getAllProviders();
90. for(Iterator iterator=providers.iterator(); iterator.hasNext(); )
91. {
92. String provider = (String)iterator.next();
93. System.out.println(provider);
94. }
95. break;
96. case R.id.getBestProviderBtn:
97. provider = new getBestLocationProvider();
98. System.out.println(provider.getProvider(locationManager, provider.setCriteria()));
99. break;
100. case R.id.getLocationBtn:
101. //绑定一个LocationListnener对象,当用户位置发生改变时,会触发监听器
102. //第一个参数是定位的方式,第二个参数是定位的周期(单位ms)
103. //第三个参数是定位的距离,每隔多少米定位一次
104. //第四个参数是监听器
105. .requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new testLocationListener());
106. break;
107. default:
108. break;
109. }
110. }
111. }
112.
113. Override
114. public boolean onCreateOptionsMenu(Menu menu) {
115. // Inflate the menu; this adds items to the action bar if it is present.
116. ().inflate(R.menu.main, menu);
117. return true;
118. }
119.
120. }
getBestLocationProvider.java
此处)折叠或打开
1. package com.example.location;
2.
3. import android.location.Criteria;
4. import android.location.LocationManager;
5. import android.widget.Button;
6.
7. public class getBestLocationProvider
8. {
9.
10. //设置查询条件
11. public Criteria setCriteria()
12. {
13. = new Criteria();
14. //要求高精度
15. .setAccuracy(Criteria.ACCURACY_FINE);
16. //要求省电
17. .setPowerRequirement(Criteria.POWER_LOW);
18. //要求不能产生费用
19. .setCostAllowed(false);
20. //不要求速度
21. .setSpeedRequired(false);
22.
23. return criteria;
24. }
25. //获取满足条件的最佳provider
26. public String getProvider(LocationManager locationManager, Criteria criteria)
27. {
28. return locationManager.getBestProvider(criteria, false);
29. }
30. }
AndroidMenifest.xml
此处)折叠或打开
1. ?xml version="1.0" encoding="utf-8"?>
2. manifest xmlns:android="http://schemas.android.com/apk/res/android"
3. ="com.example.location"
4. ="1"
5. ="1.0" >
6.
7. uses-sdk
8. ="8"
9. ="18" />
10.
11. application
12. ="true"
13. ="@drawable/ic_launcher"
14. ="@string/app_name"
15. ="@style/AppTheme" >
16. activity
17. ="com.example.location.MainActivity"
18. ="@string/app_name" >
19. intent-filter>
20. action android:name="android.intent.action.MAIN" />
21.
22. category android:name="android.intent.category.LAUNCHER" />
23. /intent-filter>
24. /activity>
25. /application>
26. uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
27. /manifest>
activity_main.xml
此处)折叠或打开
1. RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2. ="http://schemas.android.com/tools"
3. ="match_parent"
4. ="match_parent"
5. ="@dimen/activity_vertical_margin"
6. ="@dimen/activity_horizontal_margin"
7. ="@dimen/activity_horizontal_margin"
8. ="@dimen/activity_vertical_margin"
9. =".MainActivity" >
10.
11. Button
12. ="@+id/getLocationBtn"
13. ="fill_parent"
14. ="wrap_content"
15. ="用户定位" />
16. Button
17. ="@+id/getAllProviderBtn"
18. ="fill_parent"
19. ="wrap_content"
20. ="@+id/getLocationBtn"
21. ="所有定位方式" />
22. Button
23. ="@+id/getBestProviderBtn"
24. ="fill_parent"
25. ="wrap_content"
26. ="@+id/getAllProviderBtn"
27. ="最佳定位方式" />
28. /RelativeLayout>