Android 自定义GPS 位置上报工具,结合Rxjava+Retrofit+Okhttp

import java.util.List;

import java.util.Timer;

import android.Manifest;

import android.content.Context;

import android.content.Intent;

import android.content.pm.PackageManager;

import android.location.Criteria;

import android.location.Location;

import android.location.LocationListener;

import android.location.LocationManager;

import android.location.LocationProvider;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.provider.Settings;

import android.support.v4.app.ActivityCompat;

import android.util.Log;

import android.widget.Toast;

import com.baidu.mapapi.model.LatLng;

import com.tsgz.aerors.lztlcrew.android.ClientCoreSDK;

import com.tsgz.aerors.lztlcrew.app.Api;

import com.tsgz.aerors.lztlcrew.bean.LocationEntity;

import com.tsgz.aerors.lztlcrew.receiver.UpLocationServiceGenerator;

import rx.Subscription;

import rx.android.schedulers.AndroidSchedulers;

import rx.functions.Action1;

import rx.schedulers.Schedulers;

/**

* 自动位置上报管理类

*/

public class LocationSubmitManager {

private static final StringTAG ="LocationSubmitManager";

private static int timeUnit =60;// 分钟转为秒

    private Contextcontext;

private SharePreferenceUtilsharePreferenceUtil;

private LocationManagerlm;

private int secInterval;// 秒时间间隔

    private StringbestProvider;

private HandlerpositionHandler =null;

private static Timertimer =null;

private static boolean isTransmit =false;// 定位是否已发送

    private static boolean isValid =false;// 定位是否有效

    private LocationsendLocation;//发送的地理位置

    //private List testLocationList;

  //登录账号的类型,计划施工1,非计划施工0,机车2

    private int type;

private double preLocationLat,preLocationLong;

private static SubscriptionmSubscription;

public LocationSubmitManager(Context context) {

this.context = context;

preLocationLat =0;

preLocationLong =0;

isTransmit =false;

isValid =false;

sharePreferenceUtil.getInstance(context);

type = SharePreferenceUtil.getInstance(context).getUserType();

lm = (LocationManager)this.context.getSystemService(Context.LOCATION_SERVICE);

//发送时间间隔,若是按照分钟来算的话,*60;例子:一分钟发送一次

        //测试修改30s发送一次位置;60--》30

        secInterval = SharePreferenceUtil.getInstance(context).getAutoSubmitTime() *5;

}

/*启动位置上报*/

    public void startLocationSubmit() {

// 判断GPS是否正常启动

        if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

Toast.makeText(context,"请开启GPS定位...", Toast.LENGTH_LONG)

.show();

// 返回开启GPS导航设置界面

            Intent intent =new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);

context.startActivity(intent);

return;

}

System.out.println("时间间隔为:" +secInterval +"s");

// 绑定位置监听

//    bestProvider = lm.getBestProvider(getCriteria(), true);

        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

// TODO: Consider calling

            //    ActivityCompat#requestPermissions

// here to request the missing permissions, and then overriding

//  public void onRequestPermissionsResult(int requestCode, String[] permissions,

//                                          int[] grantResults)

// to handle the case where the user grants the permission. See the documentation

// for ActivityCompat#requestPermissions for more details.

            return;

}

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,secInterval *1000,0,

new MyLocationListener());

positionHandler =new PositionHandler(context);

if (timer !=null) {

timer.cancel();

}

timer =new Timer();

timer.schedule(new PositionIntervalTimerTask(positionHandler),0,

secInterval *1000);

Toast.makeText(context,"已开启自动位置上报", Toast.LENGTH_SHORT).show();

}

/*

    停止位置上报*/

    public static void stopLocationSubmit() {

if (timer !=null) {

// 结束定时器任务

            timer.cancel();

timer =null;

}

isTransmit =false;

isValid =false;

Log.e("LocationSubmitManager","stopLocationSubmit");

}

/*获取定位条件Criteria*/

    private Criteria getCriteria() {

Criteria criteria =new Criteria();

// 设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE比较精细

        criteria.setAccuracy(Criteria.ACCURACY_FINE);

// 设置是否要求速度

        criteria.setSpeedRequired(true);

// 设置是否允许运营商收费

        criteria.setCostAllowed(false);

// 设置是否需要方位信息

        criteria.setBearingRequired(true);

// 设置是否需要海拔信息

        criteria.setAltitudeRequired(true);

// 设置对电源的需求

        criteria.setPowerRequirement(Criteria.POWER_LOW);

return criteria;

}

/*位置监听*/

    public class MyLocationListenerimplements LocationListener {

public MyLocationListener() {

super();

}

@Override

        public void onLocationChanged(Location location) {

// 定位有效

            isValid =true;

}

@Override

        public void onProviderDisabled(String provider) {

// 定位已关闭,定位无效

            isValid =false;

Toast.makeText(context,"已关闭定位", Toast.LENGTH_SHORT).show();

}

@Override

        public void onProviderEnabled(String provider) {

Toast.makeText(context,"已开启定位", Toast.LENGTH_SHORT).show();

}

@Override

        public void onStatusChanged(String provider,int status, Bundle extras) {

switch (status) {

// GPS状态为可见时

                case LocationProvider.AVAILABLE:

Log.i(TAG,"当前GPS状态为可见状态");

// 定位有效

                    isValid =true;

break;

// GPS状态为服务区外时

                case LocationProvider.OUT_OF_SERVICE:

Log.i(TAG,"当前GPS状态为服务区外状态");

// 定位无效

                    isValid =false;

break;

// GPS状态为暂停服务时

                case LocationProvider.TEMPORARILY_UNAVAILABLE:

Log.i(TAG,"当前GPS状态为暂停服务状态");

// 定位无效

                    isValid =false;

break;

}

}

}

/*自动位置上报处理*/

    class PositionHandlerextends Handler {

private Contextcontext;

public PositionHandler(Context context) {

super();

this.context = context;

}

@Override

        public void handleMessage(Message msg) {

//      Log.i(TAG, "handleMessage");

            // 自动位置上报是否开启

            if (!SharePreferenceUtil.getInstance(context).getIsAutoSubmit()) {

// 停止位置上报

                stopLocationSubmit();

return;

}

// 获取最近一次位置

            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

// TODO: Consider calling

                //    ActivityCompat#requestPermissions

// here to request the missing permissions, and then overriding

//  public void onRequestPermissionsResult(int requestCode, String[] permissions,

//                                          int[] grantResults)

// to handle the case where the user grants the permission. See the documentation

// for ActivityCompat#requestPermissions for more details.

                return;

}

Location location =lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

// location为空,说明定位已经关闭

            //源程序,未修改之前的程序,自动定位进行位置上报

            if (location ==null) {

Log.e("LocationSubmitManager","location == null");

// 停止位置上报

                Toast.makeText(context,"定位失败,无法上报位置!", Toast.LENGTH_LONG).show();

return;

}

/* if (location == null) {

Log.e("LocationSubmitManager", "location == null");

locationPosition = SharePreferenceUtil.getInstance(context).getAutoLocationPos();

if (locationPosition >= testLocationList.size()) {

                    //如果记录的上报位置的数据位置超出了模拟数据的大小,则记录位置清零。locationPosition = 0;

}

location = testLocationList.get(locationPosition);

locationPosition++;

//设置是否自定义上报位置,进行开关设置

SharePreferenceUtil.getInstance(context).setAutolocationpos(locationPosition);

}*/

            if (isTransmit) {

sendLocation =null;

isTransmit =false;

}

// 发送

            sendLocation = location;

Log.e("当前的位置",sendLocation.getSpeed() +"");

//判断当前定位点是否和前一个定位点相同,若相同则不上传当前的位置;若不同则上传当前位置。

            /*if (preLocationLat == sendLocation.getLatitude() && preLocationLong == sendLocation.getLongitude()) {*/

/* if (sendLocation.getSpeed() < 1.0f) {

                ToastUtil.show(context, "位置未发生变化");

} else {*/

            sendLocation(sendLocation);

/* }*/

            isTransmit =true;

}

}

private void sendLocation(final Location location) {

if (location ==null) {

return;

}

if (type ==10) {

ToastUtil.show(context,"上报位置失败:无法获取该用户类型,请重新登陆或联系管理员");

return;

}else if (SharePreferenceUtil.getInstance(context).getIsAutoSubmit()) {

LatLng latLng = GPS2BaiDuUtil.convert(new LatLng(location.getLatitude(), location.getLongitude()));

SharePreferenceUtil.getInstance(context).setCurrentLocation(latLng.latitude +"," + latLng.longitude);

ToastUtil.show(context, latLng.toString());

mSubscription = UpLocationServiceGenerator.createService(Api.reLocation.class)

.location(latLng.latitude, latLng.longitude, ClientCoreSDK.getInstance().getCurrentLoginUserId(),type,location.getSpeed(),System.currentTimeMillis())

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Action1>() {

@Override

                        public void call(List locationEntities) {

for (LocationEntity locationEntity : locationEntities) {

preLocationLat =location.getLatitude();

preLocationLong =location.getLongitude();

}

}

},new Action1() {

@Override

                        public void call(Throwable throwable) {

try {

Log.e("发送位置失败", throwable.getMessage());

}catch (Exception e) {

e.printStackTrace();

Log.e("发送位置失败","服务器异常");

}

}

});

/*  String contentStr = "{" + "\"lon\":" + location.getLongitude() + ","

+ "\"speed\":" + location.getSpeed() + ","

+ "\"bearing\":" + location.getBearing() + ","

+ "\"time\":" + System.currentTimeMillis() + ","

+ "\"type\":" + type + ","

+ "\"userid\":" + ClientCoreSDK.getInstance().getCurrentLoginUserId() + ","

+ "\"lat\":" + location.getLatitude() + "}";

            Log.e("上报内容", contentStr);

mSubscription = UpLocationServiceGenerator.createService(Api.upLocation.class)

.location(contentStr)

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Action1>() {

@Override

public void call(List locationEntities) {

for (LocationEntity locationEntity : locationEntities) {

preLocationLat = location.getLatitude();

preLocationLong = location.getLongitude();

}

}

}, new Action1() {

@Override

public void call(Throwable throwable) {

                            Log.e("发送位置失败", "发送失败");

}

});

*/

        }

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容