packagecom.bsigps.gps;importjava.util.List;importjava.util.Timer;importjava.util.TimerTask;importandroid.app.Activity;importandroid.app.PendingIntent;importandroid.content.Context;importandroid.content.Intent;importandroid.location.Criteria;importandroid.location.Location;importandroid.location.LocationListener;importandroid.location.LocationManager;importandroid.net.Uri;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.provider.Settings;importandroid.widget.Toast;/***GPS定位服务类,封装了GPS类的细节,只向用户暴露简单的start()和stop()两个方法。需要用户实现{@linkIGPSCallback}*接口中的方法*<p>*使用方法:<br>*GPSServicegpsService=newGPSService(gpsCallback,MainActivity.this,true);*<br>*gpsService.start();**@seeIGPSCallback*/publicclassGPSService{/***GPS函数回调接口*/privateIGPSCallbackgpsCallback;privateLocationManagerloctionManager;privateStringprovider;privateContextcontex;/***GPSService是否运行*/privatebooleanisRun;/***@returnGPS状态,true为正在运行,false已停止。*/publicbooleangetIsRun(){returnisRun;}//判断是否有GPS设备publicstaticbooleanhasGPSDevice(Contextcontext){finalLocationManagermgr=(LocationManager)context.getSystemService(Context.LOCATION_SERVICE);if(mgr==null)returnfalse;finalList<String>providers=mgr.getAllProviders();if(providers==null)returnfalse;returnproviders.contains(LocationManager.GPS_PROVIDER);}//开关GPSpublicstaticvoidOnOffGps(Contextcontext){try{Settings.Secure.setLocationProviderEnabled(context.getContentResolver(),LocationManager.GPS_PROVIDER,true);}catch(Exceptione){try{LocationManagermgr=(LocationManager)context.getSystemService(Context.LOCATION_SERVICE);if(!mgr.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)){IntentgpsIntent=newIntent();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(Exceptionex){Toast.makeText(context,"请开启GPS!",Toast.LENGTH_SHORT).show();Intentintent=newIntent();intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);((Activity)context).startActivityForResult(intent,0);//此为设置完成后返回到获取界面}}}publicvoidOnOffGps(){OnOffGps(contex);}/***超时停止*/privatebooleanisAutoStop=false;/***定时器*/privateTimertimer;/***超时时间(秒)*/privateintoutTime=180;/***精度*/privatefinalfloataccuracy=500.0f;/***GPS配置参数*/privateCriteriacriteria;/***@return获取criteria*/publicCriteriagetCriteria(){initCriteria();returncriteria;}/***初始化GPS参数*/privatevoidinitCriteria(){if(criteria==null){criteria=newCriteria();criteria.setAccuracy(Criteria.ACCURACY_FINE);//高精度criteria.setAltitudeRequired(false);//不要求海拔criteria.setBearingRequired(false);//不要求方位criteria.setCostAllowed(true);//允许有花费criteria.setPowerRequirement(Criteria.POWER_LOW);//设置低功耗模式}}/***最后一次错误描述*/privateStringlastErrorDescription="";/***@return获取GPSSerivce最后一次出错的描述*/publicStringgetError(){returnlastErrorDescription;}/***设置最后一次错误描述,该描述可以通过getError()方法获取。**@seeGPSService#getError()**@paramerror*错误说明*/privatevoidsetError(Stringerror){if(error==null)return;this.lastErrorDescription=error;}/***GPSService构造函数**@paramgpsCallback*回调函数接口*@paramcontext*Context*/publicGPSService(IGPSCallbackgpsCallback,Contextcontext){super();contex=context;this.gpsCallback=gpsCallback;loctionManager=(LocationManager)context.getSystemService(Context.LOCATION_SERVICE);initCriteria();/*从可用的位置提供器中,匹配以上标准的最佳提供器*/provider=loctionManager.getBestProvider(criteria,true);}/***GPSService构造函数**@paramgpsCallback*回调函数接口*@paramcontext*Context*@paramisAutoStop*定位成功后是否自动停止GPS*/publicGPSService(IGPSCallbackgpsCallback,Contextcontext,booleanisAutoStop){super();contex=context;this.gpsCallback=gpsCallback;this.isAutoStop=isAutoStop;loctionManager=(LocationManager)context.getSystemService(Context.LOCATION_SERVICE);initCriteria();//从可用的位置提供器中,匹配以上标准的最佳提供器provider=loctionManager.getBestProvider(criteria,true);}/***返回超时时间(单位:秒)**@return*/publicintgetOutTime(){returnoutTime;}/***设置超时时间**@paramoutTime*超时时间(单位:秒,范围:10—600),只可在Start()方法调用前使用,默认180秒,如果小于10秒则超时无效,*只能手动调用Stop()方法停止GPS。*/publicvoidsetOutTime(intoutTime){if(outTime>=0&&outTime<=600){this.outTime=outTime;}}/***开始GPS定位**@return返回false表示GPS打开失败,可能没有硬件打开(由手机用户控制硬件开关)。*/publicbooleanstart(){try{if(!loctionManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)){OnOffGps();Thread.sleep(2000);}if(this.outTime>=10){//设置超时参数,启动定时器timer=newTimer();timer.schedule(newTimerTask(){@Overridepublicvoidrun(){//停止GPStimer.cancel();stop();handler.sendEmptyMessage(0);}},1000*outTime);}//注册监听函数if(locationListener!=null){provider=loctionManager.getBestProvider(criteria,true);loctionManager.requestLocationUpdates(provider,1000*10,accuracy,locationListener);}isRun=true;returntrue;}catch(Exceptione){setError(e.getMessage());e.printStackTrace();returnfalse;}}privateHandlerhandler=newHandler(){publicvoidhandleMessage(Messagemsg){switch(msg.what){case0:gpsCallback.failCallBack(IGPSCallback.ERROR_OUTTIME);break;}super.handleMessage(msg);}};/***停止GPS定位**@return*/publicbooleanstop(){try{if(locationListener!=null){loctionManager.removeUpdates(locationListener);}isRun=false;returntrue;}catch(Exceptione){setError(e.getMessage());e.printStackTrace();returnfalse;}}/***位置监听器*/privatefinalLocationListenerlocationListener=newLocationListener(){@OverridepublicvoidonStatusChanged(Stringprovider,intstatus,Bundleextras){}@OverridepublicvoidonProviderEnabled(Stringprovider){}@OverridepublicvoidonProviderDisabled(Stringprovider){}//当位置变化时触发@OverridepublicvoidonLocationChanged(Locationlocation){if(location!=null){if(location.hasAccuracy()&&location.getAccuracy()<=accuracy){//是否自动停止if(isAutoStop){stop();}gpsCallback.gpsCallback(location);}}}};}
packagecom.bsigps.gps;importandroid.location.Location;/***GPS定位服务回调函数接口,需要实现{@linkIGPSCallback#gpsCallback(Locationlocation)}和*{@linkIGPSCallback#failCallBack(Stringerror)}方法**@seeGPSService*/publicinterfaceIGPSCallback{/***GPS无信号*/publicfinalstaticStringERROR_NO_SIGNAL="GPS无信号";/***GPS超时退出*/publicfinalstaticStringERROR_OUTTIME="GPS超时退出";/***GPS硬件没有打开*/publicfinalstaticStringERROR_CLOSE="GPS硬件关闭";/***GPS执行成功,返回Location时的回调函数**@paramlocation*位置信息*/voidgpsCallback(Locationlocation);/***GPS错误时的回调函数包括GPS无信号、GPS超时退出、GPS硬件没有打开**@paramerror*错误描述,一般为{@linkIGPSCallback#ERROR_NO_SIGNAL}、*{@linkIGPSCallback#ERROR_OUTTIME}、*{@linkIGPSCallback#ERROR_CLOSE}。也可以由GPSService类自定义*/voidfailCallBack(Stringerror);}

更多相关文章

  1. Android(安卓)Activity设置全屏
  2. 【笔记】android捕获触摸事件
  3. Android(安卓)service
  4. 如何在Android中在fragment中实现点击按钮事件?
  5. android Camera模块分析
  6. android群发短信时判断短信是否发送成功
  7. Android(安卓)Audio代码分析14 - testPlaybackHeadPositionIncre
  8. Android(安卓)Activity设置全屏
  9. 箭头函数的基础使用

随机推荐

  1. Android(安卓)WIDGETS 下的Power control
  2. cocos creator android studio多渠道打包
  3. android学习网站
  4. 如何让EditText不自动获取焦点
  5. Android开机自动启动程序设置
  6. android RadioGroup的使用
  7. edittext 随文字换行 而高度增加
  8. pytest-skip详解
  9. 2011.10.17——— android 多点触控
  10. 解决Android(安卓)Studio 和 Android(安