Android GPS类,封装了GPS细节,通过start和stop方法控制GPS

 Android GPS类,封装了GPS所有细节,通过start和stop简单调用,减少软件中对GPS控制的逻辑代码,将更多精力放在业务逻辑中。

GPSService定位服务类:

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()两个方法。需要用户实现{@link IGPSCallback}接口中的方法
 * <p>
 * 使用方法: <br>
 * GPSService gpsService = new GPSService(gpsCallback, MainActivity.this, true);
 * <br>
 * gpsService.start();
 * 
 * @see 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;

    /**
     * @return 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);
                }
            }
        }
    };
}


回调函数接口:

package com.myeoa.test.gps.InterFace;

import android.location.Location;

/**
 * GPS定位服务回调函数接口,需要实现{@link IGPSCallback#gpsCallback(Location location)}和
 * {@link IGPSCallback#failCallBack(String error)}方法
 * 
 * @see GPSService
 * 
 * @author 优化设计,QQ:50199907 Email:yw1530@126.com
 * 
 */
public interface IGPSCallback {
    /**
     * GPS无信号
     */
    public final static String ERROR_NO_SIGNAL = "GPS无信号";

    /**
     * GPS超时退出
     */
    public final static String ERROR_OUTTIME = "GPS超时退出";

    /**
     * GPS硬件没有打开
     */
    public final static String ERROR_CLOSE = "GPS硬件关闭";

    /**
     * GPS执行成功,返回Location时的回调函数
     * 
     * @param location
     *            位置信息
     */
    void gpsCallback(Location location);

    /**
     * GPS错误时的回调函数 包括GPS无信号、GPS超时退出、GPS硬件没有打开
     * 
     * @param error
     *            错误描述,一般为{@link IGPSCallback#ERROR_NO_SIGNAL}、
     *            {@link IGPSCallback#ERROR_OUTTIME}、
     *            {@link IGPSCallback#ERROR_CLOSE}。也可以由GPSService类自定义
     */
    void failCallBack(String error);
}

Android DEMO示例:

打包下载:

https://files.cnblogs.com/yw1530/GPS%E5%B0%81%E8%A3%85%E7%B1%BB.zip

 

posted @ 2012-12-08 15:12  优化设计  阅读(1551)  评论(0编辑  收藏  举报