<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
+
+ <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />
+
<permission android:name="com.enqualcomm.support.permission.MIPUSH_RECEIVE" android:protectionLevel="signature"/>
<uses-permission android:name="com.enqualcomm.support.permission.MIPUSH_RECEIVE"/>
<protected-broadcast android:name="com.enqualcomm.support.ACTION_EQC_ALARM"/>
Logger.i(stringBuilder2.toString());\r
\r
if (ACTION_SEND_EMEGENCY_LOCATION_START.equals(param1Intent.getAction())){\r
- runtime.getLocationInstance().setWorkingMod(CUSTOM_MOD);\r
- runtime.getLocationInstance().setLocation_cycle(1);\r
+ runtime.getLocationInstance().setWorkingMod(EMERGNECY_MOD);\r
runtime.setPpgTestCycle(1);\r
- setLocationAlarm(CUSTOM_MOD);\r
+ setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
setHeartRateDetectAlarm(runtime.getPpgTestCycle());\r
setEmegencyLocationSTOPAlarm(5);\r
}else if (ACTION_LOCAL_SOS_ACTION.endsWith(param1Intent.getAction())){\r
connection.send(protocolAPIHelper.genStringMessage("AP10",protocolAPIHelper.AP10(runtime)));\r
\r
//开启紧急定位模式,GPS 优先1分钟一次定位,持续5分钟\r
- runtime.getLocationInstance().setWorkingMod(CUSTOM_MOD);\r
- runtime.getLocationInstance().setLocation_cycle(1);\r
- setLocationAlarm(CUSTOM_MOD);\r
+ runtime.getLocationInstance().setWorkingMod(EMERGNECY_MOD);\r
+ setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
//SOS模式,心率测试1分钟一次,持续5分钟\r
runtime.setPpgTestCycle(1);\r
setHeartRateDetectAlarm(runtime.getPpgTestCycle());\r
\r
@Override\r
public void onCreate() {\r
-// Logger.i("CoreService--onCreate002");\r
+\r
log("初始化网络协议服务");\r
mProtocolServer=this;\r
\r
this.mSignalUtil = SimSignalUtil.getInstance(this);\r
\r
//初始化 电池电量监控工具(内部注册接收电池变化)\r
- batteryUtil = new BatteryUtil(this.runtime);\r
- batteryUtil.registerBroadReceiver();\r
-\r
+ batteryUtil = new BatteryUtil(this.runtime,connection);\r
\r
//保证发送心跳时提前获取BatLevel数据\r
int batlevel=batteryUtil.getBatteryLevel(this);\r
runtime.setBattery(String.format("%03d",batlevel));\r
Logger.i("Battery get from api "+batlevel);\r
\r
+ //api直接获取batterylevel取消注册 receiver, 需要重新注册一下。\r
+\r
+ batteryUtil.registerBroadReceiver();\r
+\r
//设置计步清零时间。\r
setCleanStepCountAlarm();\r
\r
}else if(ACTION_SEND_EMEGENCY_LOCATION_STOP.equals(paramIntent.getAction())){\r
//stop Emegency location Stop\r
Config.loadModCycleSettings(runtime); //回复之前的 工作模式即可\r
- }else if (ACTION_BATTERY_LOW_MSG.equals(paramIntent.getAction())){\r
-\r
- runtime.setAlarmType(false,runtime.getBatteryLow(),false,false);\r
- //trigger AP10 报警定位\r
- CoreService.this.locationClient.triggerSOSLocationProcess();\r
-\r
- return Service.START_STICKY;\r
}\r
this.invokeHandlerServiceChain.processUserRequest(paramIntent, this.connection, this.runtime);\r
}\r
switch(mod){\r
case EMERGNECY_MOD:\r
case REALTIME_MOD:\r
- cycle=1;\r
+ cycle=60;\r
break;\r
case NORMAL_MOD:\r
- cycle=15;\r
+ cycle=15*60;\r
break;\r
case LOWPOWER_MOD:\r
- cycle=60;\r
+ cycle=60*60;\r
break;\r
case CUSTOM_MOD:\r
cycle=runtime.getLocationInstance().getLocation_cycle();\r
break;\r
}\r
\r
- AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context,cycle, ACTION_LOCATION_ALARM);\r
- sb.append(" setLocationAlarm "+ACTION_LOCATION_ALARM+" mod "+mod+", cycle "+cycle);\r
+ AlarmHelper.setRealTimeAlarmInSeconds(runtime.getContextProxy().context,cycle, ACTION_LOCATION_ALARM);\r
+ sb.append(" setLocationAlarm "+ACTION_LOCATION_ALARM+" mod "+mod+", cycle in Seconds "+cycle);\r
locationClient.triggerLocationProcess();\r
\r
Logger.i(sb.toString());\r
}\r
}\r
\r
- private void LogToast(String msg) {\r
-// if (msg!=null && msg.length()>0 && toast!=null)\r
-// toast.setText(msg).show();\r
- }\r
-\r
-\r
private static final String TAG = "ICSrv." + CoreService.class.getSimpleName();\r
\r
- private static boolean mLowPowerMode = false;\r
- private static boolean mCallStateIsIdle = true; // 非通话活动\r
- private TelephonyManager telManager;\r
private Timer mTimer_retry_connect=null;\r
- private WifiManager mWifiManager=null;\r
-\r
- private static Runtime mDevStat=null;\r
-// private protocolAPIHelper mProtocolAPI=null;\r
-\r
\r
private void log(String msg) {\r
Logger.log(TAG,msg);\r
}\r
\r
- private void log(String funcName, String msg) {\r
- Logger.log(TAG,funcName,msg);\r
- }\r
-\r
public static CoreService getInstance(){\r
return mProtocolServer;\r
}\r
@Override\r
public void onDestroy() {\r
super.onDestroy();\r
- try {\r
- unregisterReceiver(mIntentReceiver);\r
- } catch (Exception ignored) {\r
- }\r
+\r
saveStepCount();\r
this.connectionServiceChain.processDetach(this.connection, this.runtime);\r
this.invokeHandlerServiceChain.processDetach(this.connection, this.runtime);\r
unregisterReceiver(this.screenOnReceiver);\r
unregisterReceiver(this.AtCallbackBroadcastReceiver);\r
batteryUtil.unregisterBroadReceiver();\r
+ smsManager.unregisterBroadReceiver();\r
\r
}\r
\r
this.connection.close();\r
}\r
\r
- private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {\r
- @Override\r
- public void onReceive(Context context, Intent intent) {\r
- String action = intent.getAction();\r
- boolean lastIsLowPowerMode = isLowPowerMode();\r
- log("mIntentReceiver,onReceive", "START");\r
- log("mIntentReceiver,onReceive", "action: " + action\r
- + ", mCallStateIsIdle: " + mCallStateIsIdle);\r
-\r
- setLowPowerMode(false);\r
- if (!inCall() && action != null) { // 非通话活动\r
- boolean currLowPowerMode = false;\r
- if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {\r
- int rawLevel = intent.getIntExtra("level", -1);\r
- int scale = intent.getIntExtra("scale", -1);\r
- int status = intent.getIntExtra("status", -1);\r
- int level = -1; // percentage, or -1 for unknown\r
-\r
- if (status != BatteryManager.BATTERY_STATUS_CHARGING) { // 非充电状态\r
- if (rawLevel >= 0 && scale > 0) {\r
- level = (rawLevel * 100) / scale;\r
- currLowPowerMode = isLowPower(level);\r
- log("mIntentReceiver,onReceive", "level: " + level);\r
- }\r
- }\r
- } else if (action.equals(Intent.ACTION_BATTERY_LOW)) {\r
- log("mIntentReceiver,onReceive", "ACTION_BATTERY_LOW");\r
- currLowPowerMode = true;\r
- }\r
-\r
- // 只在状态改变时激活桌面\r
- boolean needActivateLauncher = (currLowPowerMode != lastIsLowPowerMode);\r
- log("mIntentReceiver,onReceive",\r
- "lastIsLowPowerMode:" + lastIsLowPowerMode +\r
- "currLowPowerMode:" + currLowPowerMode +\r
- ", needActivateLauncher:" + needActivateLauncher);\r
-\r
- setLowPowerMode(currLowPowerMode);\r
-\r
-\r
- if (needActivateLauncher) {\r
- log("低电量,进入协议省电模式!");\r
- }\r
-\r
- }\r
- log("mIntentReceiver,onReceive", "END");\r
- }\r
- };\r
-\r
- public boolean isLowPowerMode() {\r
- log("isLowPowerMode", "" + mLowPowerMode);\r
- return mLowPowerMode;\r
- }\r
-\r
- /**\r
- * 根据电量,判断是否是低电量\r
- *\r
- * @param level\r
- * @return\r
- */\r
- public static boolean isLowPower(int level) {\r
- return (level <= 15);\r
- }\r
-\r
- public void setLowPowerMode(boolean v) {\r
- log("setLowPowerMode", "" + v);\r
- mLowPowerMode = v;\r
- }\r
-\r
- private boolean inCall() {\r
-// return telManager.getCallState() != TelephonyManager.CALL_STATE_IDLE;\r
- return false;\r
- }\r
}\r
import android.widget.Toast;\r
\r
import com.enqualcomm.support.bean.Runtime;\r
+import com.enqualcomm.support.utils.APNUtil;\r
import com.enqualcomm.support.utils.DeviceInfoUtil;\r
import com.enqualcomm.support.utils.Logger;\r
import com.enqualcomm.support.utils.ServiceUtil;\r
\r
\r
public class ICSmsManager {\r
- private static String mNumber;\r
+ private static String ACTION_SMSCMD="com.enqualcomm.support.SMSCMD";\r
private static long preTimeMillis;\r
- private Uri SMS_INBOX = Uri.parse("content://sms/inbox");\r
private Context mContext = null;\r
Runtime runtime;\r
-// ArrayList<CheckBillInfo> smsInfoList;\r
ICSmsManager.SmsReceiver smsReceiver;\r
-// ArrayList<byte[]> source;\r
\r
public ICSmsManager( Runtime _runtime) {\r
-// this.source = src;\r
this.runtime = _runtime;\r
this.mContext = runtime.getContextProxy().context;\r
this.smsReceiver = new ICSmsManager.SmsReceiver();\r
- IntentFilter intentFilter = new IntentFilter();\r
- intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");\r
- intentFilter.setPriority(2147483647);\r
- this.mContext.registerReceiver(this.smsReceiver, intentFilter);\r
+\r
+ registerBroadReceiver();\r
}\r
\r
public void sendSMS(String phonenumber, String msg) {\r
while(msgit.hasNext()) {\r
String message= (String)msgit.next();\r
Logger.i("reply message to "+phonenumber+", "+message);\r
- smsManager.sendTextMessage(phonenumber, (String)null,message, (PendingIntent)null, (PendingIntent)null);\r
+ if (phonenumber!=null && !phonenumber.isEmpty()) {\r
+ smsManager.sendTextMessage(phonenumber, (String) null, message, (PendingIntent) null, (PendingIntent) null);\r
+ }\r
}\r
}\r
\r
\r
return true;\r
}\r
+ public void registerBroadReceiver() {\r
+\r
+ IntentFilter intentFilter = new IntentFilter();\r
+ intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");\r
+ intentFilter.setPriority(2147483647);\r
+ this.mContext.registerReceiver(this.smsReceiver, intentFilter);\r
\r
+ intentFilter = new IntentFilter();\r
+ intentFilter.addAction(ACTION_SMSCMD);\r
+ (this.runtime.getContextProxy()).context.registerReceiver(this.mSMSCMD_BroadcastReceiver, intentFilter);\r
+ }\r
+\r
+ public void unregisterBroadReceiver() {\r
+ (this.runtime.getContextProxy()).context.unregisterReceiver(this.mSMSCMD_BroadcastReceiver);\r
+ (this.runtime.getContextProxy()).context.unregisterReceiver(this.smsReceiver);\r
+ }\r
+\r
+ private final BroadcastReceiver mSMSCMD_BroadcastReceiver = new BroadcastReceiver() {\r
+ @Override\r
+ public void onReceive(Context context, Intent intent) {\r
+ String action = intent.getAction();\r
+ if (ACTION_SMSCMD.equals(action)) {\r
+ String cmd = intent.getStringExtra("smsCmd");\r
+ handleSMS_CMD("", cmd);\r
+ }\r
+ }\r
+ };\r
//1:短信设置服务器\r
//#ip#=198.11.183.28,5088#\r
//回复 ip set ok\r
//SW: L02_20200208_V1\r
public void handleSMS_CMD(String phonenumber, String sms){\r
if (isAdminNumber(phonenumber)) {\r
- if (sms.startsWith("#deviceinfo#")) {\r
+\r
+ if (sms==null || sms.isEmpty()) return ;\r
+\r
+ if (sms.startsWith("#apn#=")&& sms.endsWith("#")){\r
+ String[] tmp=sms.split("#");\r
+ if(tmp.length==3) {\r
+ String[] apnvalues= tmp[2].replace("=","").split(",");\r
+ if (apnvalues.length==4){\r
+ String mcc=apnvalues[0];\r
+ String mnc=apnvalues[1];\r
+ String apnName=apnvalues[2];\r
+ String apn=apnvalues[3];\r
+ String user="";\r
+ String password="";\r
+ if(APNUtil.addVPN(mcc,mnc,apnName,apn,user,password,mContext)==true){\r
+ sendSMS(phonenumber,"apn add success!");\r
+ }else{\r
+ sendSMS(phonenumber,"apn add failed!");\r
+ }\r
+ }else if (apnvalues.length==6) {\r
+ String mcc=apnvalues[0];\r
+ String mnc=apnvalues[1];\r
+ String apnName=apnvalues[2];\r
+ String apn=apnvalues[3];\r
+ String user=apnvalues[4];\r
+ String password=apnvalues[5];\r
+ if(APNUtil.addVPN(mcc,mnc,apnName,apn,user,password,mContext)==true){\r
+ sendSMS(phonenumber,"apn add success!");\r
+ }else{\r
+ sendSMS(phonenumber,"apn add failed!");\r
+ }\r
+ }else if (apnvalues.length==1){\r
+ if (apnvalues[0].equals("current")) {\r
+\r
+ String apnstr = APNUtil.getCurrentAPN(mContext);\r
+ sendSMS(phonenumber, apnstr);\r
+ }else{\r
+ sendSMS(phonenumber,"apn cmd format error!");\r
+ }\r
+ } else{\r
+ sendSMS(phonenumber,"apn cmd format error!");\r
+ }\r
+ }else {\r
+\r
+ sendSMS(phonenumber,"apn cmd format error!");\r
+\r
+ }\r
+ }else if (sms.startsWith("#deviceinfo#")) {\r
Logger.i("SMS "+sms+" reply "+DeviceInfoUtil.getShortDeviceInfo(runtime));\r
sendSMS(phonenumber,DeviceInfoUtil.getShortDeviceInfo(runtime));\r
}else if (sms.startsWith("#status#")) {\r
- String reply="IMEI="+runtime.IMEI()+"\nSW:"+DeviceInfoUtil.getVersionCode(runtime.getContextProxy().context)+" "+DeviceInfoUtil.getSWVersionDisplayName();\r
+ String reply="IMEI="+runtime.IMEI()+"\nSW:"+DeviceInfoUtil.getVersionCode(mContext)+" "+DeviceInfoUtil.getSWVersionDisplayName();\r
Logger.i("SMS "+sms+" reply \n"+reply);\r
sendSMS(phonenumber,reply);\r
}else if (sms.startsWith("#imei:")) {\r
String imei=sms.substring(6);\r
Logger.i("SMS "+sms+" imei="+imei);\r
if (imei.length()==15 ) {\r
- Config.setIMEI(runtime.getContextProxy().context, imei);\r
+ Config.setIMEI(mContext, imei);\r
runtime.setImeiAndCid(imei, "");\r
sendSMS(phonenumber, "set IMEI " + imei + " sucess !");\r
CoreService.getInstance().disconnect_server();\r
CoreService.getInstance().ReConnectToServer();\r
}else if (imei.equals("reset")) {\r
- Config.setIMEI(runtime.getContextProxy().context, "");\r
- runtime.setImeiAndCid(PhoneUtils.getIMEI(runtime.getContextProxy().context), "");\r
- sendSMS(phonenumber, "reset IMEI to " + PhoneUtils.getIMEI(runtime.getContextProxy().context) + " sucess !");\r
+ Config.setIMEI(mContext, "");\r
+ runtime.setImeiAndCid(PhoneUtils.getIMEI(mContext), "");\r
+ sendSMS(phonenumber, "reset IMEI to " + PhoneUtils.getIMEI(mContext) + " sucess !");\r
CoreService.getInstance().disconnect_server();\r
CoreService.getInstance().ReConnectToServer();\r
+ }else if (imei.equals("current")) {\r
+ sendSMS(phonenumber, "Current IMEI " + runtime.IMEI());\r
}else{\r
sendSMS(phonenumber, "set IMEI " + imei + " failed ! len!=15");\r
}\r
String tmp[]=sms.split("=");\r
String reply="";\r
Logger.i(sms+" len "+tmp.length);\r
- if (tmp.length==2)\r
- {\r
- //分析 以 , 为分界的格式\r
- String[] ipstr = tmp[1].split(",");\r
- if (ipstr[0].equals("reset#")) {\r
- Config.setProtocolServerHost(runtime.getContextProxy().context, Runtime.DefaultHost);\r
- Config.setProtocolServerAddr(runtime.getContextProxy().context, "", Runtime.DefaultPort);\r
+ if (tmp.length==2) {\r
+ if (tmp[1].equals("reset#")) {\r
+ Config.setProtocolServerHost(mContext, Runtime.DefaultHost);\r
+ Config.setProtocolServerAddr(mContext, "", Runtime.DefaultPort);\r
reply = "reset ServerIP to " + Runtime.DefaultHost + ":" + Runtime.DefaultPort + " success! ";\r
Config.loadServerSettings(runtime);\r
CoreService.getInstance().disconnect_server();\r
CoreService.getInstance().ReConnectToServer();\r
- }else if (ipstr.length==2){\r
- String ip=ipstr[0];\r
- int port=Integer.valueOf(ipstr[1].replace("#",""));\r
- Config.setProtocolServerHost(runtime.getContextProxy().context,ip);\r
- Config.setProtocolServerAddr(runtime.getContextProxy().context,"",port);\r
- reply = sms+" success! ";\r
- Config.loadServerSettings(runtime);\r
- CoreService.getInstance().disconnect_server();\r
- CoreService.getInstance().ReConnectToServer();\r
- }else{\r
- //分析以 : 为分界的格式\r
- ipstr = tmp[1].split(":");\r
-\r
- if (ipstr[0].equals("reset#")) {\r
- Config.setProtocolServerHost(runtime.getContextProxy().context, Runtime.DefaultHost);\r
- Config.setProtocolServerAddr(runtime.getContextProxy().context, "", Runtime.DefaultPort);\r
- reply = "reset ServerIP to " + Runtime.DefaultHost + ":" + Runtime.DefaultPort + " success! ";\r
- Config.loadServerSettings(runtime);\r
- CoreService.getInstance().disconnect_server();\r
- CoreService.getInstance().ReConnectToServer();\r
- } else if (ipstr.length == 2) {\r
+ } else if (tmp[1].equals("current#")) {\r
+ reply = "current serverAddress:" + runtime.getHost() + ":" + runtime.getPort();\r
+ } else {\r
+ //分析 以 , 为分界的格式\r
+ String[] ipstr = tmp[1].split(",");\r
+ if (ipstr.length == 2) {\r
String ip = ipstr[0];\r
int port = Integer.valueOf(ipstr[1].replace("#", ""));\r
- Config.setProtocolServerHost(runtime.getContextProxy().context, ip);\r
- Config.setProtocolServerAddr(runtime.getContextProxy().context, "", port);\r
+ Config.setProtocolServerHost(mContext, ip);\r
+ Config.setProtocolServerAddr(mContext, "", port);\r
reply = sms + " success! ";\r
Config.loadServerSettings(runtime);\r
CoreService.getInstance().disconnect_server();\r
CoreService.getInstance().ReConnectToServer();\r
} else {\r
- reply = sms + " falied! ";\r
+ //分析以 : 为分界的格式\r
+ ipstr = tmp[1].split(":");\r
+ if (ipstr.length == 2) {\r
+ String ip = ipstr[0];\r
+ int port = Integer.valueOf(ipstr[1].replace("#", ""));\r
+ Config.setProtocolServerHost(mContext, ip);\r
+ Config.setProtocolServerAddr(mContext, "", port);\r
+ reply = sms + " success! ";\r
+ Config.loadServerSettings(runtime);\r
+ CoreService.getInstance().disconnect_server();\r
+ CoreService.getInstance().ReConnectToServer();\r
+ } else {\r
+ reply = sms + " falied! ";\r
+ }\r
}\r
}\r
}else{\r
reply = sms + " falied! ";\r
}\r
sendSMS(phonenumber, reply);\r
+ }else if (sms.startsWith("#setlocation#=")&& sms.endsWith("#")){\r
+ String tmp[]=sms.split("=");\r
+ if (tmp.length==2){\r
+ if (tmp[1].equals("reset#")){\r
+ Config.loadModCycleSettings(runtime);//恢复初始设置\r
+ sendSMS(phonenumber, "reset to Location Mode="+runtime.getLocationInstance().getWorkingMod()+", Cycle="+runtime.getLocationInstance().getLocation_cycle());\r
+ }else {\r
+ String[] t=tmp[1].replace("#","").split(",");\r
+ if (t.length==2){\r
+ int mod=0;\r
+ int cycle=0;\r
+ try {\r
+ mod = Integer.valueOf(t[0]);\r
+ cycle = Integer.valueOf(t[1]);\r
+ }catch (Exception e){\r
+ e.printStackTrace();\r
+ }\r
+ if(mod<6&& mod>0 && cycle>=30 ){\r
+ runtime.getLocationInstance().setLocation_cycle(cycle);\r
+ runtime.getLocationInstance().setWorkingMod(mod);\r
+ CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
+ sendSMS(phonenumber, "set to Location Mode="+runtime.getLocationInstance().getWorkingMod()+", Cycle="+runtime.getLocationInstance().getLocation_cycle());\r
+ }else{\r
+ sendSMS(phonenumber, "set to Location Failed ,value range should be 1<= Mode <=5 and cycle >=30!");\r
+ }\r
+\r
+ }else{\r
+ sendSMS(phonenumber, "setlocation format error!");\r
+ }\r
+ }\r
+\r
+ }else{\r
+ sendSMS(phonenumber, "setlocation format error!");\r
+ }\r
+\r
}\r
}\r
}\r
Logger.i("lbs_ok "+lbs_ok+" waitAndSendLocation wifi_ok " + wifi_ok+ " gps_ok "+gps_ok + " mode "+mode);\r
\r
switch(mode){\r
+ case ICLocation.CUSTOM_MOD:\r
case ICLocation.EMERGNECY_MOD:\r
case ICLocation.REALTIME_MOD:\r
- case ICLocation.CUSTOM_MOD:\r
+\r
\r
//GPS 优先的话多给些时间(10秒)\r
if (checktimes> 50) timeout=true;\r
updateCellInfo();\r
startWifiScan();\r
switch(mod){\r
+ case ICLocation.CUSTOM_MOD:\r
+ if(runtime.getLocationInstance().getLocation_cycle()<60){\r
+ nmeaListener.setNoStop(true);\r
+ }else{\r
+ nmeaListener.setNoStop(false);\r
+ }\r
case ICLocation.EMERGNECY_MOD:\r
case ICLocation.REALTIME_MOD:\r
- case ICLocation.CUSTOM_MOD:\r
startGpsLocate();\r
break;\r
}\r
private double longitude;\r
private double latitude;\r
\r
+ private boolean noStop=false;\r
+\r
private int SearchTimeout = 120;\r
private int noSignalCount=0;\r
private int searchCout=0;\r
private GPS_CURRENT_STATUS gpsMode;\r
int numberOfSatellites;\r
Runtime runtime;\r
- \r
+\r
+\r
+ public void setNoStop(boolean nostop){\r
+ noStop=nostop;\r
+ if (noStop==false){\r
+ stopListen();\r
+ }\r
+ }\r
public NMEAListener(LocationManager paramLocationManager, Runtime paramRuntime) {\r
this.locationManager = paramLocationManager;\r
this.runtime = paramRuntime;\r
};\r
\r
\r
+ private final int MSG_WHAT_GPS_FIXED=300;\r
+ private final int MSG_WHAT_GPS_TIMEOUT=100;\r
+ private final int MSG_WHAT_GPS_NOSTAR=200;\r
+ private final int MSG_WHAT_GPS_FIXED_NO_STOP=400;\r
\r
Handler temHandler = new Handler(new Handler.Callback() {\r
@Override\r
public boolean handleMessage(Message message) {\r
\r
- if( message.what== 100|| message.what==200){\r
+ if( message.what== MSG_WHAT_GPS_TIMEOUT|| message.what==MSG_WHAT_GPS_NOSTAR){\r
//no start\r
//do nothing\r
\r
- }else if (message.what==300){\r
+ }else if (message.what==MSG_WHAT_GPS_FIXED){\r
//fixed\r
/*\r
只有当前GPS已经定位,且location不为空才给 runtime赋值GPS坐标。\r
*/\r
runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_FIXED);\r
\r
+ }else if (message.what== MSG_WHAT_GPS_FIXED_NO_STOP){\r
+ runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_FIXED);\r
+ return true;\r
}\r
\r
NMEAListener.this.stopListen();\r
- return false;\r
+ return true;\r
}\r
});\r
private void get3MaxSnrSatellite(GpsSatellite gst){\r
gpsMode=GPS_CURRENT_STATUS.GPS_TIMEOUT;\r
runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_GPS_TIEMOUT);\r
\r
- stop(100);\r
+ stop(MSG_WHAT_GPS_TIMEOUT);\r
}\r
if (noSignalCount> 10){\r
sb2.append(" 搜索"+searchCout+"次,超过"+noSignalCount+"次没有收到星,退出GPS定位");\r
gpsMode=GPS_CURRENT_STATUS.GPS_NOSINGAL;\r
runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_GPS_TIEMOUT);\r
\r
- stop(200);\r
+ stop(MSG_WHAT_GPS_NOSTAR);\r
}\r
if (Config.LOG_TOFILE) FileOutputUtil.fileOutput(this.runtime.getCacheDir(),"GPS",sb2.toString());\r
\r
}\r
private void delaystop(){\r
\r
+ if (noStop){\r
+ NMEAListener.this.temHandler.sendEmptyMessageDelayed(MSG_WHAT_GPS_FIXED_NO_STOP, 3000L);\r
+ }else {\r
/*\r
只有当前GPS已经定位,且location不为空才给 runtime赋值GPS坐标。\r
延迟三秒后才设置runtime的定位标志,以便稳定坐标值。\r
*/\r
- //发送停止消息\r
- NMEAListener.this.temHandler.sendEmptyMessageDelayed(300,3000L);\r
+ //发送停止消息\r
+ NMEAListener.this.temHandler.sendEmptyMessageDelayed(MSG_WHAT_GPS_FIXED, 3000L);\r
+ }\r
}\r
boolean isFrist = true;\r
\r
\r
public boolean startListen() {\r
\r
- Criteria criteria = new Criteria();\r
- criteria.setAccuracy(Criteria.ACCURACY_FINE);// 设置为最大精度\r
- criteria.setAltitudeRequired(false);//不要求海拔信息\r
- criteria.setBearingRequired(false);// 不要求方位信息\r
- criteria.setCostAllowed(true);//是否允许付费\r
- criteria.setPowerRequirement(Criteria.POWER_LOW);// 对电量的要求\r
-\r
- String provider = locationManager.getBestProvider(criteria,true);\r
-\r
- Logger.i("GPS StartListen with Provider "+provider);\r
- this.locationManager.requestLocationUpdates(provider, 0L, 0.0F, this);\r
- this.listening = true;\r
- noSignalCount=0;\r
- longitude=0;\r
- latitude=0;\r
- searchCout=0;\r
- gpsMode = GPS_CURRENT_STATUS.GPS_LISTENING;\r
- locationManager.addGpsStatusListener(statusListener);//监听搜星状态\r
+ if (this.listening == false) {\r
+ Criteria criteria = new Criteria();\r
+ criteria.setAccuracy(Criteria.ACCURACY_FINE);// 设置为最大精度\r
+ criteria.setAltitudeRequired(false);//不要求海拔信息\r
+ criteria.setBearingRequired(false);// 不要求方位信息\r
+ criteria.setCostAllowed(true);//是否允许付费\r
+ criteria.setPowerRequirement(Criteria.POWER_LOW);// 对电量的要求\r
+\r
+ String provider = locationManager.getBestProvider(criteria, true);\r
+\r
+ Logger.i("GPS StartListen with Provider " + provider);\r
+ this.locationManager.requestLocationUpdates(provider, 0L, 0.0F, this);\r
+ this.listening = true;\r
+ noSignalCount = 0;\r
+ longitude = 0;\r
+ latitude = 0;\r
+ searchCout = 0;\r
+ gpsMode = GPS_CURRENT_STATUS.GPS_LISTENING;\r
+ locationManager.addGpsStatusListener(statusListener);//监听搜星状态\r
// this.locationManager.addNmeaListener(this);\r
\r
//做个热启动\r
- return gpsHotStart();\r
+ return gpsHotStart();\r
+ }else{\r
+ return true;\r
+ }\r
}\r
\r
\r
\r
public static final int NORMAL_MOD=1; //location rate 1 time per 15 minutes\r
public static final int LOWPOWER_MOD=2; // location rate 1 time per hour\r
- public static final int EMERGNECY_MOD=3; //location rate 1 time per minutes\r
- public static final int REALTIME_MOD=4; //location rate 1 time per minutes\r
+ public static final int REALTIME_MOD=3; //location rate 1 time per minutes\r
+ public static final int EMERGNECY_MOD=4; //location rate 1 time per minutes work 5 minutes\r
public static final int CUSTOM_MOD=5; //location rate 1 time per minutes\r
\r
\r
--- /dev/null
+package com.enqualcomm.support.utils;\r
+\r
+import android.content.ContentResolver;\r
+import android.content.ContentValues;\r
+import android.content.Context;\r
+import android.database.Cursor;\r
+import android.net.Uri;\r
+import android.telephony.TelephonyManager;\r
+import android.widget.Toast;\r
+\r
+public class APNUtil {\r
+\r
+ /**\r
+ * 当前连接APN\r
+ * */\r
+ private static Uri APN_URI_NOW =Uri.parse("content://telephony/carriers/current");\r
+ /**\r
+ * 所有APN\r
+ * */\r
+ private static Uri APN_URI = Uri.parse("content://telephony/carriers");\r
+\r
+ private static Uri CURRENT_APN_URI = Uri.parse("content://telephony/carriers/preferapn");\r
+\r
+ public static String getCurrentAPN(Context context){\r
+ ContentResolver resolver = context.getContentResolver();\r
+ Cursor c = resolver.query(APN_URI_NOW, null, null, null, null); //从apn列表中查找apn名称为myapn的apn信息\r
+ String APNSTR="";\r
+ if (c != null && c.moveToNext()) {\r
+ int id = c.getShort(c.getColumnIndex("_id")); //获取该apn的id信息\r
+ String mcc=c.getString(c.getColumnIndex("mcc"));\r
+ String mnc=c.getString(c.getColumnIndex("mnc"));\r
+ String name=c.getString(c.getColumnIndex("name"));\r
+ String apnname=c.getString(c.getColumnIndex("apn"));\r
+ String user=c.getString(c.getColumnIndex("user"));\r
+ String pwd=c.getString(c.getColumnIndex("password"));\r
+ APNSTR="Current APN "+id+","+mcc+","+mnc+","+name+","+apnname+","+user+","+pwd;\r
+ Logger.i(APNSTR);\r
+ } else {\r
+ Logger.i("APN不存在");\r
+ return "APN 不存在";\r
+ }\r
+ return APNSTR;\r
+ }\r
+ public static boolean addVPN(String apnName, String apn, String mcc,String mnc , String user,String passwd,Context context) {\r
+\r
+ if (checkAPN(mcc,mnc,apn,context)==true){\r
+ Logger.i("VPN 已经存在,不需要添加!");\r
+ return false;\r
+ }\r
+ //添加新的APN到系统\r
+ int id= AddNewApn(apnName,apn,mcc,mnc,user,passwd,context);\r
+\r
+ //添加后设置为当前指定APN\r
+ SetAPN(id,context);\r
+\r
+\r
+ boolean isAddSuccess = checkAPN(mcc,mnc,apn,context);\r
+ if (isAddSuccess) {\r
+ Logger.i("APN 添加成功!");\r
+ return true;\r
+// Toast.makeText(NewAPNActivity.this, "新增APN成功", Toast.LENGTH_SHORT).show();\r
+ } else {\r
+ Logger.i("APN 添加失败!");\r
+ return false;\r
+// Toast.makeText(NewAPNActivity.this, "新增APN失败", Toast.LENGTH_SHORT).show();\r
+ }\r
+ }\r
+ // 设置接入点\r
+ public static void SetAPN(int id,Context context) {\r
+ ContentResolver resolver = context.getContentResolver();\r
+ ContentValues values = new ContentValues();\r
+ values.put("apn_id", id);\r
+ resolver.update(CURRENT_APN_URI, values, null, null);\r
+ }\r
+ public static boolean checkAPN(String mcc,String mnc,String apn,Context context) {\r
+ // 检查系统已经写入的APN\r
+ Cursor cr = context.getContentResolver().query(APN_URI, null, null, null, null);\r
+ while (cr != null && cr.moveToNext()) {\r
+ if(cr.getString(cr.getColumnIndex("apn")).equals(apn)\r
+ && cr.getString(cr.getColumnIndex("mcc")).equals(mcc)\r
+ && cr.getString(cr.getColumnIndex("mnc")).equals(mnc)){\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+\r
+ public static int AddNewApn(String apnName,String apn, String mcc,String mnc , String user,String passwd, Context context) {\r
+ Logger.i("添加一个新的apn ==> "+apnName+", mcc="+mcc+", mnc="+mnc+", user="+user+", password="+passwd);\r
+ int apnId = -1;\r
+ ContentResolver resolver = context.getContentResolver();\r
+ ContentValues values = new ContentValues();\r
+ values.put("name", apnName); //apn中文描述\r
+ values.put("apn", apn); //apn名称\r
+ values.put("type", "default");\r
+ values.put("numeric", mcc+mnc);\r
+ values.put("mcc", mcc);\r
+ values.put("mnc", mnc);\r
+ values.put("proxy", "");\r
+ values.put("port", "");\r
+ values.put("mmsproxy", "");\r
+ values.put("mmsport", "");\r
+ values.put("user", user);\r
+ values.put("server", "");\r
+ values.put("password", passwd);\r
+ values.put("mmsc", "");\r
+ Cursor c = null;\r
+// 获取新添加的apn的ID\r
+ try {\r
+ Uri newRow = resolver.insert(APN_URI, values);\r
+ if (newRow != null) {\r
+ c = resolver.query(newRow, null, null, null, null);\r
+ int idindex = c.getColumnIndex("_id");\r
+ c.moveToFirst();\r
+ apnId = idindex;\r
+ }\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ if (c != null)\r
+ c.close();\r
+ return apnId;\r
+ }\r
+\r
+\r
+}\r
}\r
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, l + (minutes * 60 * 1000), pendingIntent);\r
}\r
- \r
+\r
+ public static void setRealTimeAlarmInSeconds(Context context, int seconds, String actionname) {\r
+ AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);\r
+ Intent intent = new Intent(context, com.enqualcomm.support.CoreService.class);\r
+ intent.setAction(actionname);\r
+ PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);\r
+ alarmManager.cancel(pendingIntent);\r
+ long l = SystemClock.elapsedRealtime();\r
+ StringBuilder stringBuilder = new StringBuilder();\r
+ stringBuilder.append("SDK_INT=");\r
+ stringBuilder.append(Build.VERSION.SDK_INT);\r
+ stringBuilder.append(",m=,");\r
+ stringBuilder.append(23);\r
+ stringBuilder.append(",kitkat=");\r
+ stringBuilder.append(19);\r
+ Logger.i(stringBuilder.toString());\r
+ if (Build.VERSION.SDK_INT >= 19) {\r
+ alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, l + (seconds * 1000), pendingIntent);\r
+ return;\r
+ }\r
+ alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, l + (seconds * 1000), pendingIntent);\r
+ }\r
+\r
public static void setTimeAlarm(Context context, int hour, int minutes, String paramString) {\r
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);\r
Intent intent = new Intent(context, com.enqualcomm.support.CoreService.class);\r
\r
import com.enqualcomm.support.Config;\r
import com.enqualcomm.support.CoreService;\r
+import com.enqualcomm.support.adapter.protocolAPIHelper;\r
import com.enqualcomm.support.bean.Runtime;\r
\r
import static android.content.Context.BATTERY_SERVICE;\r
BatteryUtil.this.mRuntime.setBatteryLow(true);\r
Logger.i("lowbattery finish video_end_call");\r
\r
+ mRuntime.setAlarmType(false,mRuntime.getBatteryLow(),false,false);\r
+ //trigger AP10 报警定位\r
+ connection.send(protocolAPIHelper.genStringMessage("AP10",protocolAPIHelper.AP10(mRuntime)));\r
\r
- ComponentName componentName = new ComponentName("com.enqualcomm.support", "com.enqualcomm.support.CoreService");\r
- Intent intent = (new Intent(ACTION_BATTERY_LOW_MSG)).setComponent(componentName);\r
- (mRuntime.getContextProxy()).context.startService(intent);\r
}\r
}\r
};\r
private StringBuffer mBuffer;\r
\r
Runtime mRuntime;\r
- \r
- public BatteryUtil(Runtime paramRuntime) { this.mRuntime = paramRuntime; }\r
+ Connection connection;\r
+ public BatteryUtil(Runtime paramRuntime,Connection _connection) {\r
+ this.mRuntime = paramRuntime;\r
+ connection = _connection;\r
+ }\r
\r
public void registerBroadReceiver() {\r
this.mBuffer = new StringBuffer();\r
BatteryManager batteryManager = (BatteryManager)context.getSystemService(BATTERY_SERVICE);\r
return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);\r
} else {\r
- Intent intent = new ContextWrapper(context.getApplicationContext()).\r
- registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));\r
+ Intent intent = new ContextWrapper(context.getApplicationContext()).registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));\r
return (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100) /\r
intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);\r
}\r
scoreManager = new ScoreManager();
dnsManager = new DnsManager();
speedtestManager = new SpeedtestManager();
- startTimer();
+// startTimer();
}
public static DNSCache getInstance() {