分享

【新提醒】【2012

 熟练工场 2014-03-05
本帖最后由 优化设计 于 2012-12-13 10:37 编辑

GPS封装类,封装了GPS细节,通过start和stop简单调用即可控制GPS。
可自定义GPS超时时间、精度。获取的GPS坐标信息可调用方法转换为百度坐标系,获取地理位置信息,配合百度产品使用。
该类保持更新,如有bug,请童鞋们及时留言反馈。

V0.2,更新2012-12-10
1、增加GPS真实坐标转百度坐标
2、增加从百度接口中获取中文地理信息

  


部分代码:
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
package com.myeoa.test.gps.InterFace;
 
import java.util.Timer;
import java.util.TimerTask;
 
import com.myeoa.test.gps.MainActivity;
 
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
 
/**
* GPS定位服务类,封装了GPS类的细节,只向用户暴露简单的start()和stop()两个方法。需要用户实现{<a href="\"http://www./home.php?mod=space&uid=91636\"" target="\"_blank\"">@link</a> IGPSCallback}接口中的方法
* <p>
* 使用方法: <br>
* GPSService gpsService = new GPSService(gpsCallback, MainActivity.this, true);
* <br>
* gpsService.start();
*
* <a href="\"http://www./home.php?mod=space&uid=133757\"" target="\"_blank\"">@see</a> IGPSCallback
*
* @author 优化设计,QQ:50199907 Email:yw1530@126.com
*
*/
public class GPSService {
        /**
         * GPS函数回调接口
         */
        private IGPSCallback gpsCallback;
 
        private LocationManager loctionManager;
 
        private String provider;
 
        /**
         * GPSService是否运行
         */
        private boolean isRun;
 
        /**
         * <a href="\"http://www./home.php?mod=space&uid=7300\"" target="\"_blank\"">@return</a> GPS状态,true为正在运行,false已停止。
         */
        public boolean getIsRun() {
                return isRun;
        }
 
        /**
         * 超时停止
         */
        private boolean isAutoStop = false;
 
        /**
         * 定时器
         */
        private Timer timer;
 
        /**
         * 超时时间(秒)
         */
        private int outTime = 180;
 
        /**
         * 精度
         */
        private final float accuracy = 500.0f;
 
        /**
         * GPS配置参数
         */
        private Criteria criteria;
 
        /**
         * @return 获取criteria
         */
        public Criteria getCriteria() {
                initCriteria();
                return criteria;
        }
 
        /**
         * 初始化GPS参数
         */
        private void initCriteria() {
                if (criteria == null) {
                        criteria = new Criteria();
                        criteria.setAccuracy(Criteria.ACCURACY_FINE); // 高精度
                        criteria.setAltitudeRequired(false); // 不要求海拔
                        criteria.setBearingRequired(false); // 不要求方位
                        criteria.setCostAllowed(true); // 允许有花费
                        criteria.setPowerRequirement(Criteria.POWER_LOW);// 设置低功耗模式
                }
        }
 
        /**
         * 最后一次错误描述
         */
        private String lastErrorDescription = "";
 
        /**
         * @return 获取GPSSerivce最后一次出错的描述
         */
        public String getError() {
                return lastErrorDescription;
        }
 
        /**
         * 设置最后一次错误描述,该描述可以通过getError()方法获取。
         *
         * @see GPSService#getError()
         *
         * @param error
         *            错误说明
         */
        private void setError(String error) {
                if (error == null)
                        return;
                this.lastErrorDescription = error;
        }
 
        /**
         * GPSService构造函数
         *
         * @param gpsCallback
         *            回调函数接口
         * @param context
         *            Context
         */
        public GPSService(IGPSCallback gpsCallback, Context context) {
                super();
                this.gpsCallback = gpsCallback;
                loctionManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
 
                initCriteria();
 
                /* 从可用的位置提供器中,匹配以上标准的最佳提供器 */
                provider = loctionManager.getBestProvider(criteria, true);
        }
 
        /**
         * GPSService构造函数
         *
         * @param gpsCallback
         *            回调函数接口
         * @param context
         *            Context
         * @param isAutoStop
         *            定位成功后是否自动停止GPS
         */
        public GPSService(IGPSCallback gpsCallback, Context context, boolean isAutoStop) {
                super();
                this.gpsCallback = gpsCallback;
                this.isAutoStop = isAutoStop;
                loctionManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
 
                initCriteria();
 
                // 从可用的位置提供器中,匹配以上标准的最佳提供器
                provider = loctionManager.getBestProvider(criteria, true);
        }
 
        /**
         * 返回超时时间(单位:秒)
         *
         * @return
         */
        public int getOutTime() {
                return outTime;
        }
 
        /**
         * 设置超时时间
         *
         * @param outTime
         *            超时时间(单位:秒,范围:10—600),只可在Start()方法调用前使用,默认180秒,如果小于10秒则超时无效,
         *            只能手动调用Stop() 方法停止GPS。
         */
        public void setOutTime(int outTime) {
                if (outTime >= 0 && outTime <= 600) {
                        this.outTime = outTime;
                }
        }
 
        /**
         * 开始GPS定位
         *
         * @return 返回false表示GPS打开失败,可能没有硬件打开(由手机用户控制硬件开关)。
         */
        public boolean start() {
                try {
                        if (!loctionManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
                                // GPS没有打开
                                setError("GPS没有硬件打开");
                                gpsCallback.failCallBack(IGPSCallback.ERROR_CLOSE);
                                return false;
                        }
 
                        if (this.outTime >= 10) {
                                // 设置超时参数,启动定时器
                                timer = new Timer();
                                timer.schedule(new TimerTask() {
                                        @Override
                                        public void run() {
                                                // 停止GPS
                                                timer.cancel();
                                                stop();
                                                handler.sendEmptyMessage(0);
                                        }
                                }, 1000 * outTime);
                        }
 
                        // 注册监听函数
                        if (locationListener != null) {
                                loctionManager.requestLocationUpdates(provider, 1000 * 10, accuracy, locationListener);
                        }
 
                        isRun = true;
                        return true;
                } catch (Exception e) {
                        setError(e.getMessage());
                        e.printStackTrace();
                        return false;
                }
        }
 
        private Handler handler = new Handler() {
                public void handleMessage(Message msg) {
                        switch (msg.what) {
                        case 0:
                                gpsCallback.failCallBack(IGPSCallback.ERROR_OUTTIME);
                                break;
                        }
                        super.handleMessage(msg);
                }
        };
 
        /**
         * 停止GPS定位
         *
         * @return
         */
        public boolean stop() {
                try {
                        if (locationListener != null) {
                                loctionManager.removeUpdates(locationListener);
                        }
                        isRun = false;
                        return true;
                } catch (Exception e) {
                        setError(e.getMessage());
                        e.printStackTrace();
                        return false;
                }
        }
 
        /**
         * 位置监听器
         */
        private final LocationListener locationListener = new LocationListener() {
                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {
                }
 
                @Override
                public void onProviderEnabled(String provider) {
                }
 
                @Override
                public void onProviderDisabled(String provider) {
                }
 
                // 当位置变化时触发
                @Override
                public void onLocationChanged(Location location) {
                        if (location != null) {
                                if (location.hasAccuracy() && location.getAccuracy() <= accuracy) {
                                        // 是否自动停止
                                        if (isAutoStop) {
                                                stop();
                                        }
                                        gpsCallback.gpsCallback(location);
                                }
                        }
                }
        };
}


 GPS封装类 V0.2.zip (303.25 KB, 下载次数: 555) 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多