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"); } }