package com.jqyd.shareInterface;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.AsyncTask;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.LinearLayout;
import com.jqyd.app.LocationUtils;
import com.jqyd.app.MyApp;
import com.jqyd.app.WriteFile;
import com.jqyd.manager.R;
import com.jqyd.manager.UpLocationManager;
import com.jqyd.model.LocationModule;
import com.jqyd.model.PromiseModel;
import com.jqyd.model.RecordModel;
import com.jqyd.pub.JqydDateUtil;
public class UpLocationService extends Service {
private final static String TAG = "LXRBRZ-UPLOCATION";
private WriteFile writeFile = new WriteFile(UpLocationService.this,TAG
+ JqydDateUtil.getDateDayOne(new Date()));
private UpLocationManager upLocMgr;
private AlarmManager upLocAlarm;
private boolean needSet = true;
private boolean nowUpLoc = false;
private Baidu_location baidu = null;
private Optsharepre_interface shareFile = null;
private int success = 0, fail = 0;
private MyApp myApp = null;
Optdb_interfce db;
private String userName;
private int lastmode;
@Override
public void onCreate() {
super.onCreate();
writeFile.writeToFile("onCreate");
baidu = new Baidu_location(UpLocationService.this);
shareFile = new Optsharepre_interface(UpLocationService.this);
upLocAlarm = (AlarmManager) this.getSystemService(ALARM_SERVICE);
myApp = (MyApp) this.getApplication();
success = myApp.getSuccess();
fail = myApp.getFail();
upLocMgr = new UpLocationManager(shareFile,UpLocationService.this);
createView();
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
writeFile.writeToFile("onStartCommand");
Intent upLocIntent = new Intent(UpLocationService.this,
UpLocationService.class);
final PendingIntent upLocPi = PendingIntent.getService(
UpLocationService.this, 0, upLocIntent, 0);
Log.e("lxsb", "onStartCommand");
PromiseModel promiseModel = upLocMgr.getSettingPolicy();
System.out.println("promiseModel state "+promiseModel.getState());
System.out.println("next turan "+JqydDateUtil.getDateSecOne(JqydDateUtil.getCalendarFromLong(promiseModel.getTimeValue()).getTime()));
writeFile.writeToFile("promiseModel state "+promiseModel.getState());
writeFile.writeToFile("next turan "+JqydDateUtil.getDateSecOne(JqydDateUtil.getCalendarFromLong(promiseModel.getTimeValue()).getTime()));
Log.e("xiao", ""+new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()));
Log.e("promiseModel.getState()", promiseModel.getState()+"");
Log.e("promiseModel.getTimeValue()", promiseModel.getTimeValue()+"+++++++"+JqydDateUtil.getDateSecOne(JqydDateUtil.getCalendarFromLong(promiseModel.getTimeValue()).getTime()));
writeFile.writeToFile("promiseModel.getTimeValue()"+promiseModel.getTimeValue()+"+++++++"+JqydDateUtil.getDateSecOne(JqydDateUtil.getCalendarFromLong(promiseModel.getTimeValue()).getTime()));
writeFile.writeToFile("lastmode="+lastmode);
int period = new Integer(shareFile.getDataFromPres("JGSJ")).intValue();
switch (promiseModel.getState()) {
//-1: 没有上报计划,休眠到明天的上班时间
//1:上班前,需要休眠到上班时刻上报;
//2:在上报时间内,还没有到下个上报时间点,需要到休眠时间点上报;
//3:在上报时间内,已经过了上个上报时间点,需要上报一次,然后休眠到下个上报时间点;
//4:正好在设置时间点,需要上报一次,同时设置周期性上报;
//5:当天的第一次上报,需要立即上报一次,然后休眠到下个时间点;
//6:过了下班时间,休眠到明天的上班时间;
case -1:
upLocAlarm.set(AlarmManager.RTC_WAKEUP,
promiseModel.getTimeValue(), upLocPi);
nowUpLoc = false;
break;
case 1:
upLocAlarm.set(AlarmManager.RTC_WAKEUP,
promiseModel.getTimeValue(), upLocPi);
nowUpLoc = false;
break;
case 2:
// writeFile.writeToFile("本次应该上报时间:"+new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(promiseModel.getTimeValue()));
// writeFile.writeToFile("小于60秒上报时间:"+new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(promiseModel.getTimeValue()-30000));
// writeFile.writeToFile("超过60秒上报时间:"+new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(promiseModel.getTimeValue()+30000));
upLocAlarm.set(AlarmManager.RTC_WAKEUP,
promiseModel.getTimeValue(), upLocPi);
// if(android.os.Build.BRAND.equals("Xiaomi")&&(lastmode == 2 ||lastmode == 5)){//小米系统AlarmManager延时
// nowUpLoc = true;
// }
// else if(System.currentTimeMillis()>(promiseModel.getTimeValue()-period*60*1000)-60000 &&
// System.currentTimeMillis()<(promiseModel.getTimeValue()-period)+60000){
// nowUpLoc=true;
// }
// else{
nowUpLoc = false;
// }
break;
case 3:
upLocAlarm.set(AlarmManager.RTC_WAKEUP,
promiseModel.getTimeValue(), upLocPi);
nowUpLoc = true;
break;
case 4:
if (needSet) {
writeFile.writeToFile("设置上报周期为"+promiseModel.getTimeValue());
upLocAlarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+promiseModel.getTimeValue(),
promiseModel.getTimeValue(), upLocPi);
needSet = false;
// nowUpLoc = false;
} else {
if(lastmode== 2 ||lastmode==3){
upLocAlarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+promiseModel.getTimeValue(),
promiseModel.getTimeValue(), upLocPi);
// nowUpLoc = false;
// }else{
}
}
nowUpLoc = true;
break;
case 5:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
upLocAlarm.set(AlarmManager.RTC_WAKEUP,
promiseModel.getTimeValue(), upLocPi);
nowUpLoc = true;
break;
case 6:
upLocAlarm.cancel(upLocPi);
needSet = true;
SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
Log.e("上报开始时间", format2.format(promiseModel.getTimeValue()));
upLocAlarm.set(AlarmManager.RTC_WAKEUP,
promiseModel.getTimeValue(), upLocPi);
nowUpLoc = false;
break;
}
lastmode = promiseModel.getState();//记录本次上报状态
writeFile.writeToFile("next lastmode"+lastmode);
writeFile.writeToFile("nowUpLoc"+nowUpLoc);
if (nowUpLoc) {
Log.e("xiao", "上报:"+new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date())+"-------"+new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(promiseModel.getTimeValue()));
Log.e("xiao", "上次时间:::"+shareFile.getDataFromPres("hisSbTime"));
//为了兼容之前记录的数据,第一次使用也上报一次
if(shareFile.getDataFromPres("hisSbTime").equals("-1") || shareFile.getDataFromPres("hisSbTime").length()==8){
Log.e("xiao", "第一次用,或者数据格式和之前的一样,上报");
writeFile.writeToFile("up location,老版的上次上报时间为"+shareFile.getDataFromPres("hisSbTime")+",所以上报一次");
UpLocation();
flags = START_STICKY;
return super.onStartCommand(intent, flags, startId);
}
try {
writeFile.writeToFile("不是第一次用,判断时间");
Log.e("xiao", "不是第一次用,判断间隔和时间 ");
long hisTime = new SimpleDateFormat("yyyyMMddHHmmss").parse(shareFile.getDataFromPres("hisSbTime")).getTime();
//如果当前时间和上次时间间隔小于间隔时间则不上报
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
//是否到了上报时间点,是否是正点上报,如果是,就和上次上报时间相比是否大于1分钟,如果是就上报,
long jgsj = Integer.parseInt(shareFile.getDataFromPres("JGSJ"))*60*1000;
// if(("19700101".equals(sdf.format(promiseModel.getTimeValue())) && (System.currentTimeMillis() - hisTime > 60000))
// ||(android.os.Build.BRAND.equals("Xiaomi")&& (System.currentTimeMillis() - hisTime > 60000))){
Log.e("xiao", "上报!!!!!上次的间隔时间为:"+(System.currentTimeMillis() - hisTime));
//上报
writeFile.writeToFile("up location,上次上报时间和当前时间大于1分钟且到达上报时间,上报");
UpLocation();
// }else{
// writeFile.writeToFile(JqydDateUtil.getDateSecOne(JqydDateUtil.getCalendarFromLong(promiseModel.getTimeValue()-jgsj).getTime())
// +"和上次上报时间比较是否大于一分钟"+(System.currentTimeMillis() - hisTime));
// Log.e("xiao","========不上报!!!");
// }
} catch (Exception e) {
e.printStackTrace();
}
}
flags = START_STICKY;
return super.onStartCommand(intent, flags, startId);
}
private void createView(){
LinearLayout ll;
WindowManager.LayoutParams wlp = new LayoutParams();
WindowManager wm = (WindowManager) getApplication().getSystemService(getApplication().WINDOW_SERVICE);
wlp.type = LayoutParams.TYPE_PHONE;
wlp.format = PixelFormat.RGBA_8888;
wlp.alpha=0.5f;
wlp.flags = LayoutParams.FLAG_NOT_FOCUSABLE;
wlp.gravity = Gravity.LEFT | Gravity.TOP;
wlp.x=0;
wlp.y=0;
wlp.width = LayoutParams.WRAP_CONTENT;
wlp.height = LayoutParams.WRAP_CONTENT;
wlp.width=1;
wlp.height=1;
LayoutInflater inflater = LayoutInflater.from(getApplication());
ll = (LinearLayout) inflater.inflate(R.layout.window, null);
View view = ll.findViewById(R.id.view);
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
wm.addView(ll, wlp);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
private void UpLocation() {
shareFile.editPres("hisSbTime", JqydDateUtil
.getDateforMill(new Date()));
class PDResult {
boolean isSucess;
}
AsyncTask<Context, Void, PDResult> task = new AsyncTask<Context, Void, PDResult>() {
@Override
protected PDResult doInBackground(Context... params) {
Log.e("upLocation", "----------start");
//db = new Optdb_interfce(UpLocationService.this);
userName = shareFile.getDataFromPres("username");
Log.e("userName--------", userName);
//db.close_SqlDb();
PDResult ret = new PDResult();
LocationModule locModule = new LocationModule();
LocationUtils locUtil = new LocationUtils(
UpLocationService.this);
locModule = locUtil.takeCellInfos();
boolean a =locUtil.getLocation(locModule, "", "", baidu);
LocationModule lastLocation = new LocationModule();
lastLocation = myApp.getLastLocation();
if(lastLocation!=null&&locModule.getDw_type()!=-1&&a==true){
boolean isError = locUtil.isError(locModule,lastLocation);
if(isError){
locModule.setDw_type(-1);
}
}
if(a==true&&locModule.getDw_type()!=-1){
myApp.setLastLocation(locModule);
}
ret.isSucess = false;
JSONObject jsonObject = new JSONObject();
JSONArray jsonArr = new JSONArray();
JSONObject object = new JSONObject();
try {
object.put("netstate", locModule.getNetstate());
object.put("cosim", shareFile.getDataFromPres("COSIM"));
object.put("regsim", shareFile.getDataFromPres("REGSIM"));
if(locModule.getDw_type()==-1){
object.put("time",System.currentTimeMillis());
}else{
object.put("time", locModule.getTime());
}
object.put("lon", locModule.getLon());
object.put("lat", locModule.getLat());
object.put("cell_id", locModule.getCell_id());
object.put("lac_code", locModule.getLac());
object.put("country_code", locModule.getCcode());
object.put("ncode", locModule.getNcode());
object.put("signal_strength", "0");
object.put("loc_method", locModule.getDw_type());
object.put("radius", locModule.getRadius());
object.put("gguid", shareFile.getDataFromPres("GGUID"));
object.put("guid", shareFile.getDataFromPres("GUID"));
object.put("zdmc", userName);
object.put("yys", locModule.getYys());
object.put("jiange", shareFile.getDataFromPres("JGSJ"));
jsonArr.put(object);// 放入JSONArray数组中
jsonObject.put("recordList", jsonArr);
UpdataToServer server = new UpdataToServer(
UpLocationService.this);
Log.e("位置上传", jsonObject.toString());
writeFile.writeToFile("send to server "+jsonObject.toString());
String result = server.dataToServer("LXSB", jsonObject);
if (!result.equals("-1") && !result.equals("500")) {
JSONObject obj = new JSONObject(result);
JSONArray resultList = (JSONArray) obj.get("resultList");
JSONObject returnObj = new JSONObject(result);
for (int i = 0; i < resultList.length(); i++) {
JSONObject obj_info = (JSONObject) resultList.get(i);
String res = obj_info.getString("result");
if (res.equals("0")) {// 上报成功
// 仅供显示
success++;
// 判断是否保存有数据
shareFile.editPres("hisSbTime", JqydDateUtil.getDateforMill(new Date()));
// .getDateDayTwo(new Date()));
myApp.setSuccess(success);
ret.isSucess = true;
writeFile.writeToFile("send sucess");
}
}
}
if (!ret.isSucess ) {
Log.e(TAG, "上报失败写入终端数据库");
CheckState_interface check = new CheckState_interface(UpLocationService.this);
writeFile.writeToFile("上报位置失败,保存当天记录至终端数据库表");
ArrayList<Object> list = new ArrayList<Object>();
JSONObject jsonObj = jsonArr.getJSONObject(0);
RecordModel recordModel = new RecordModel();
if (jsonObj.getLong("time") == 0) {
recordModel.setAdd_time(String.valueOf(new Date()
.getTime()));
} else {
recordModel.setAdd_time(String.valueOf(jsonObj
.getLong("time")));
}
recordModel.setCcode(jsonObj.getString("country_code"));
recordModel.setCid(jsonObj.getString("cell_id"));
recordModel.setGid("999");
recordModel.setLac(jsonObj.getString("lac_code"));
recordModel.setLat(String.valueOf(jsonObj
.getDouble("lat")));
recordModel.setLon(String.valueOf(jsonObj
.getDouble("lon")));
recordModel.setNcode(jsonObj.getString("ncode"));
recordModel.setRaduis(jsonObj.getString("radius"));
recordModel.setWzbs(String.valueOf(jsonObj
.getInt("loc_method")));
recordModel.setXhqd(jsonObj
.getString("signal_strength"));
recordModel.setResult(jsonObj.getString("jiange"));// 存放间隔时间
recordModel.setBz(jsonObj.getString("yys"));// 备注字段存放运营商
recordModel.setRemark1(check.checkWifiAndGPRS()+"");
list.add(recordModel);
Optdb_interfce db = new Optdb_interfce(
UpLocationService.this);
db.updateToDb("T_RECORDS", list);
db.close_SqlDb();
// 仅供显示
fail++;
myApp.setFail(fail);
// shareFile.editPres("hisSbTime", JqydDateUtil
// .getDateforMill(new Date()));
writeFile.writeToFile("send Fail Save to db");
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ret;
}
@Override
protected void onPostExecute(PDResult result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
};
task.execute(UpLocationService.this);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
writeFile.writeToFile("onDestroy");
}
}