用户定位
一、简单的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>