原文链接:http://blog.csdn.net/dawanganban/article/details/11303537
01.package com.example.gpstest;
02.
03.import org.apache.http.util.LangUtils;
04.
05.import android.content.Context;
06.import android.content.SharedPreferences;
07.import android.content.SharedPreferences.Editor;
08.import android.location.Criteria;
09.import android.location.Location;
10.import android.location.LocationListener;
11.import android.location.LocationManager;
12.import android.os.Bundle;
13.import android.text.TextUtils;
14.
15./**
16. * 保证这个类只存在一个实例
17. * @author zehua
18. *
19. */
20.public class GPSInfoProvider {
21. LocationManager manager;
22. private static GPSInfoProvider mGPSInfoProvider; //单例
23. private static Context context; //单例
24. private static MyLoactionListener listener; //单例
25. //1.私有化构造方法
26.
27. private GPSInfoProvider(){};
28.
29. //2. 提供一个静态的方法 可以返回他的一个实例
30. public static synchronized GPSInfoProvider getInstance(Context context){
31. if(mGPSInfoProvider==null){
32. synchronized (GPSInfoProvider.class) {
33. if(mGPSInfoProvider == null){
34. mGPSInfoProvider = new GPSInfoProvider();
35. GPSInfoProvider.context = context;
36. }
37. }
38. }
39. return mGPSInfoProvider;
40. }
41.
42.
43. // 获取gps 信息
44. public String getLocation(){
45. manager =(LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
46. //获取所有的定位方式
47. //manager.getAllProviders(); // gps //wifi //
48. //获取当前手机最好的位置提供者
49. String provider = getProvider(manager);
50. // 注册位置的监听器
51. //60000每隔一分钟获取当前位置(最大频率)
52. //位置每改变50米重新获取位置信息
53. //getListener()位置发生改变时的回调方法
54. manager.requestLocationUpdates(provider,60000, 50, getListener());
55. //拿到最后一次的位置信息
56. SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
57. String location = sp.getString("location", "");
58. return location;
59. }
60.
61.
62.
63. //停止gps监听
64. public void stopGPSListener(){
65. manager.removeUpdates(getListener());
66. }
67.
68. //获取gps监听实例
69. private synchronized MyLoactionListener getListener(){
70. if(listener==null){
71. synchronized (GPSInfoProvider.class) {
72. if(listener == null){
73. listener = new MyLoactionListener();
74. }
75. }
76.
77. }
78. return listener;
79. }
80.
81. private class MyLoactionListener implements LocationListener{
82.
83. /**
84. * 当手机位置发生改变的时候 调用的方法
85. */
86. public void onLocationChanged(Location location) {
87. String latitude ="latitude "+ location.getLatitude(); //获取纬度
88. String longtitude = "longtitude "+ location.getLongitude(); //获取精度
89. //最后一次获取到的位置信息 存放到sharedpreference里面
90. SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
91. Editor editor = sp.edit();
92. editor.putString("location", latitude+" - "+ longtitude);
93. editor.commit();
94. }
95.
96. /**
97. * 某一个设备的状态发生改变的时候 调用
98. * 可用->不可用
99. * 不可用->可用
100. * status 当前状态
101. * extras 额外消息
102. */
103. public void onStatusChanged(String provider, int status, Bundle extras) {
104.
105. }
106.
107. /**
108. * 某个设备被打开
109. */
110. public void onProviderEnabled(String provider) {
111.
112. }
113.
114. /**某个设备被禁用
115. *
116. */
117. public void onProviderDisabled(String provider) {
118.
119. }
120.
121. }
122.
123. /**\
124. *
125. * @param manager 位置管理服务
126. * @return 最好的位置提供者
127. */
128. private String getProvider(LocationManager manager){
129. //设置查询条件
130. Criteria criteria = new Criteria();
131. //定位精准度
132. criteria.setAccuracy(Criteria.ACCURACY_FINE);
133. //对海拔是否敏感
134. criteria.setAltitudeRequired(false);
135. //对手机耗电性能要求(获取频率)
136. criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
137. //对速度变化是否敏感
138. criteria.setSpeedRequired(true);
139. //是否运行产生开销(费用)
140. criteria.setCostAllowed(true);
141. //如果置为ture只会返回当前打开的gps设备
142. //如果置为false如果设备关闭也会返回
143. return manager.getBestProvider(criteria, true);
144. }
145.}