文档章节

android GPS封装类

宝贝女儿
 宝贝女儿
发布于 2014/11/25 13:52
字数 1081
阅读 124
收藏 2
package com.bsigps.gps;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.widget.Toast;
/**
 * GPS定位服务类,封装了GPS类的细节,只向用户暴露简单的start()和stop()两个方法。需要用户实现{@link IGPSCallback}
 * 接口中的方法
 * <p>
 * 使用方法: <br>
 * GPSService gpsService = new GPSService(gpsCallback, MainActivity.this, true);
 * <br>
 * gpsService.start();
 * 
 * @see IGPSCallback
 */
public class GPSService {
 /**
  * GPS函数回调接口
  */
 private IGPSCallback gpsCallback;
 private LocationManager loctionManager;
 private String provider;
 private Context contex;
 /**
  * GPSService是否运行
  */
 private boolean isRun;
 /**
  * @return GPS状态,true为正在运行,false已停止。
  */
 public boolean getIsRun() {
  return isRun;
 }
 // 判断是否有GPS设备
 public static boolean hasGPSDevice(Context context) {
  final LocationManager mgr = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
  if (mgr == null)
   return false;
  final List<String> providers = mgr.getAllProviders();
  if (providers == null)
   return false;
  return providers.contains(LocationManager.GPS_PROVIDER);
 }
 // 开关GPS
 public static void OnOffGps(Context context) {
  try {
   Settings.Secure.setLocationProviderEnabled(context.getContentResolver(), LocationManager.GPS_PROVIDER, true);
  } catch (Exception e) {
   try {
    LocationManager mgr = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    if (!mgr.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
     Intent gpsIntent = new Intent();
     gpsIntent.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
     gpsIntent.addCategory("android.intent.category.ALTERNATIVE");
     gpsIntent.setData(Uri.parse("custom:3"));
     PendingIntent.getBroadcast(context, 0, gpsIntent, 0).send();
    }
   } catch (Exception ex) {
    Toast.makeText(context, "请开启GPS!", Toast.LENGTH_SHORT).show();
    Intent intent = new Intent();  
          intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);  
          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    ((Activity) context).startActivityForResult(intent, 0); // 此为设置完成后返回到获取界面
   }
  }
 }
 public void OnOffGps() {
  OnOffGps(contex);
 }
 /**
  * 超时停止
  */
 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();
  contex = context;
  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();
  contex = context;
  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)) {
    OnOffGps();
    Thread.sleep(2000);
   }
   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) {
    provider = loctionManager.getBestProvider(criteria, true);
    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.bsigps.gps;
import android.location.Location;
/**
 * GPS定位服务回调函数接口,需要实现{@link IGPSCallback#gpsCallback(Location location)}和
 * {@link IGPSCallback#failCallBack(String error)}方法
 * 
 * @see GPSService
 */
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);
}

© 著作权归作者所有

宝贝女儿

宝贝女儿

粉丝 2
博文 10
码字总数 6689
作品 2
哈尔滨
程序员
私信 提问
Android 平台上编程实现 GPS 定位

在几个月前,开发式手机联盟推出自己的Android手机雏形时,受到了极大的追捧。但是到现在还没有真机在市场上销售,Google为了鼓励开发 人员来开发Android手机的应用程序,提供了1千万美金来奖...

红薯
2009/06/18
1.3W
4
Android中GPS类及方法简介

GPS是Global Positioning System(全球定位系统)的简称,它的作用就是为全球的物体提供定位功能。GPS定位是一门高新技术,但对于Android程序员来说,开发GPS功能的应用程序又十分简单,And...

buffer的blogs
2013/08/01
0
0
android完整智能家居、备忘录、蓝牙配对、3D动画库、购物车页面、版本更新自动安装等源码

Android精选源码 app 版本更新、下载完毕自动自动安装(http://www.apkbus.com/thread-603095-1-1.html) android指针式分数仪表盘(http://www.apkbus.com/thread-603097-1-1.html) ANdroid蓝牙......

Android爱开源
2018/10/09
59
0
android获取/更改gps和WIFI状态

一.WIFI状态的获取和更改 适用于 SDK1.0 , SDK1.5 1.获取WIFI状态 方法1:通过WifiManager进行操作 要求权限:android.permission.ACCESS_WIFI_STATE 方法2:通过Settings.System进行操作 ...

华宰
2011/09/06
8.2K
1
Android开发进阶(三)--初探Android平台上的定位服务(GPS)

初探Android平台上的定位服务(GPS) 特别声明:以下所有操作都别忘记了加上权限: [html] view plaincopyprint? <uses-permission android:name="android.permission.ACCESSCOARSELOCATION" ......

程序袁_绪龙
2015/01/07
480
0

没有更多内容

加载失败,请刷新页面

加载更多

北京哪里有开电子餐饮费发票

开电子餐饮费发票发票电薇13564998196从主业来看,2019年众诚保险围绕车险业务采取增设分支机构、加强合作、优化用户体验等动作,但综合成本率仍有所上行,业内指出,车险的价格透明度属天然...

枅票嶶fp2090
7分钟前
9
0
哪里有开电子餐饮费发票

开电子餐饮费发票发票电薇13564998196从主业来看,2019年众诚保险围绕车险业务采取增设分支机构、加强合作、优化用户体验等动作,但综合成本率仍有所上行,业内指出,车险的价格透明度属天然...

枅票微fp2090
13分钟前
17
0
略谈分布式系统中的容器设计模式

本文作者:zytan_cocoa 略谈分布式系统中的容器设计模式 谭中意 2020/3/5 前言:云原生(Cloud Native)不仅仅是趋势,更是现在进行时,它是构建现代的,可弹性伸缩的,快速迭代的计算网络服...

百度开发者中心
03/11
13
0
OSChina 周三乱弹 —— 小姐姐的领带有点带歪了,请帮忙正一下

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《アイタクテ -voice & piano-》- 和紗 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
23
0
对象名称前的单下划线和双下划线是什么意思?

问题: Can someone please explain the exact meaning of having leading underscores before an object's name in Python? 有人可以解释一下在Python中对象名称前加下划线的确切含义吗? ......

技术盛宴
今天
29
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部