import static com.enqualcomm.support.Constants.ACTION_QUERY_WEATHER;
import static com.enqualcomm.support.Constants.ACTION_SEND_EMEGENCY_LOCATION_START;
import static com.enqualcomm.support.Constants.ACTION_SEND_EMEGENCY_LOCATION_STOP;
+import static com.enqualcomm.support.Constants.ALARM_POWER_OFF;
import static com.enqualcomm.support.Constants.FROM_ALARM;
import static com.enqualcomm.support.Constants.FROM_SERVER;
import static com.enqualcomm.support.Constants.HEARTBEAT_ALARM;
antiservice.check_ant_event();
} else if (ACTION_CHECK_CUTOFF_EVENT.equals(paramIntent.getAction())) {
antiservice.check_cut_event();
+ } else if (ALARM_POWER_OFF.equals(paramIntent.getAction())) {
+ //收到定时关机闹钟指令
+ //先设置下一次的,然后再去关机
+ int hour = paramIntent.getIntExtra("hour", -1);
+ int min = paramIntent.getIntExtra("min", -1);
+ Context context = runtime.getContextProxy().context;
+ Intent intent = new Intent(context, CoreService.class);
+ intent.putExtra("hour", hour);
+ intent.putExtra("min", min);
+ PendingIntent pendingIntent = PendingIntent.getService(context,
+ 0, intent,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+ AlarmHelper.setPowerOffAlarm(context, pendingIntent, hour, min);
+ //关机
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ Util.shutdown();
+ }
+ }, 1000);
}
this.invokeHandlerServiceChain.processUserRequest(paramIntent, this.connection, this.runtime);
private static final long ONE_WEEK = 604800000L;\r
\r
private static Method setImpl;\r
- \r
+\r
static {\r
try {\r
setImpl = AlarmManager.class.getDeclaredMethod("setImpl", new Class[]{int.class, long.class, long.class, long.class, PendingIntent.class, android.os.WorkSource.class});\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 intent = new Intent(context, CoreService.class);\r
intent.setAction(actionname);\r
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);\r
alarmManager.cancel(pendingIntent);\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
+ public static void setTimeAlarm(Context context, int hour, int minutes, String action) {\r
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);\r
- Intent intent = new Intent(context, com.enqualcomm.support.CoreService.class);\r
- intent.setAction(paramString);\r
- PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);\r
+ Intent intent = new Intent(context, CoreService.class);\r
+ intent.setAction(action);\r
+ PendingIntent pendingIntent = PendingIntent.getService(context,\r
+ 0, intent,\r
+ PendingIntent.FLAG_UPDATE_CURRENT);\r
long l3 = System.currentTimeMillis();\r
Calendar calendar = Calendar.getInstance();\r
calendar.set(Calendar.HOUR_OF_DAY, hour);\r
alarmManager.setExact(AlarmManager.RTC_WAKEUP, l1, pendingIntent);\r
}\r
\r
+\r
+ public static void setPowerOffAlarm(Context context, PendingIntent pendingIntent, int hour, int min) {\r
+ AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);\r
+ long l3 = System.currentTimeMillis();\r
+ Calendar calendar = Calendar.getInstance();\r
+ calendar.set(Calendar.HOUR_OF_DAY, hour);\r
+ calendar.set(Calendar.MINUTE, min);\r
+ calendar.set(Calendar.SECOND, 0);\r
+ long l2 = calendar.getTimeInMillis();\r
+ long l1 = l2;\r
+ if (l2 < l3)\r
+ l1 = l2 + ONE_DAY;\r
+ alarmManager.cancel(pendingIntent);\r
+ //设置闹钟\r
+ alarmManager.setExact(AlarmManager.RTC_WAKEUP, l1, pendingIntent);\r
+ }\r
+\r
+\r
public static void setNextWeekAlarm(AlarmManager mAlarmManager, long timeStamp, PendingIntent pendingIntent) {\r
//周期为下一周\r
timeStamp += ONE_WEEK;\r
import android.Manifest;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
+import android.app.AlarmManager;
+import android.app.PendingIntent;
import android.bluetooth.BluetoothAdapter;
import android.content.ComponentName;
import android.content.ContentResolver;
import com.enqualcomm.support.provider.FZDMessageProvider;
import com.enqualcomm.support.provider.FZDSettingsProvider;
import com.enqualcomm.support.service.HeartRateManager;
+import com.enqualcomm.support.utils.AlarmHelper;
import com.enqualcomm.support.utils.CameraUtil;
import com.enqualcomm.support.utils.Connection;
import com.enqualcomm.support.utils.ICLogger;
import java.util.HashMap;
import java.util.UUID;
+import static com.enqualcomm.support.Constants.ALARM_POWER_OFF;
import static com.enqualcomm.support.Constants.FROM_SERVER;
import static com.enqualcomm.support.Constants.contact;
import static com.enqualcomm.support.LocationClient.LOCATION_MODE;
TALK,//向对方发起音视频聊天
UNKNOWN_CMD,
MESSAGE/*文字消息*/,
- profile//情景模式
+ profile,//情景模式
}
private static HashMap<CMD_TYPE, String> cmdMap = null;
}
public void handlePOWEROFF(Connection connection) {
-
connection.send(POWEROFF());
}
break;
case KA:
ICLogger.i("服务器收到心跳包KA");
- mConnection.DeliverCMDMessageToSystem("heartbeat", cmd);//通知下面线程状态变化
+ //通知下面线程状态变化
+ mConnection.DeliverCMDMessageToSystem("heartbeat", cmd);
break;
case AL:
- mConnection.DeliverCMDMessageToSystem("AL", cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ //通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ mConnection.DeliverCMDMessageToSystem("AL", cmd);
break;
case PRACTICE:
- mConnection.DeliverCMDMessageToSystem("PRACTICE", cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ //通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ mConnection.DeliverCMDMessageToSystem("PRACTICE", cmd);
break;
case UD:
- mConnection.DeliverCMDMessageToSystem("UD", cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ //通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ mConnection.DeliverCMDMessageToSystem("UD", cmd);
break;
case UD2:
- mConnection.DeliverCMDMessageToSystem("UD2", cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ //通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ mConnection.DeliverCMDMessageToSystem("UD2", cmd);
break;
case PING:
handlePing(mRuntime, data);
case CR:
//立即定位指令(长链接有效)
handleCR(mConnection);
- mConnection.DeliverCMDMessageToSystem("StartLocate", cmd);//通知下面线程状态变化
+ //通知下面线程状态变化
+ mConnection.DeliverCMDMessageToSystem("StartLocate", cmd);
break;
case UPLOAD:
//设置工作模式
handleUPLOAD(mConnection, mRuntime, cmd, data);
- mConnection.DeliverCMDMessageToSystem("setWorkMod", cmd);//通知下面线程状态变化
+ //通知下面线程状态变化
+ mConnection.DeliverCMDMessageToSystem("setWorkMod", cmd);
case SOS:
//收到设置SOS号码
handleSOS(mConnection, mRuntime, cmd, data);
case POWEROFF:
//收到关机
handlePOWEROFF(mConnection);
- ICLogger.i("收到服务器关机命令BP31");
- mConnection.DeliverCMDMessageToSystem("poweroff", cmd);//通知下面线程状态变化
+ ICLogger.i("收到服务器关机命令POWEROFF");
+ //通知下面线程状态变化
+ mConnection.DeliverCMDMessageToSystem("poweroff", cmd);
break;
case hrtstart:
handleHrtstart(mConnection);
case FIND:
//收到查找设备消息
handleFIND(mConnection);
- mConnection.DeliverCMDMessageToSystem("findDev", cmd);//通知下面线程状态变化
+ //通知下面线程状态变化
+ mConnection.DeliverCMDMessageToSystem("findDev", cmd);
break;
case MESSAGE:
handleMESSAGE(mConnection, data);
handleProfile(cmd, data, mRuntime);
mConnection.DeliverCMDMessageToSystem("profile", cmd);
break;
+ case BOOTOFF:
+ ICLogger.d("收到开关机时间设置指令");
+ handleBOOTOFF(cmd, data, mRuntime);
+ mConnection.DeliverCMDMessageToSystem("BOOTOFF", cmd);
+ break;
}
return ret;
}
+ private static final String BOOT_OFF_ACTION_OFF = "0";
+ private static final String BOOT_OFF_ACTION_ON = "1";
+ private static final long ONE_DAY = 86400000L;
+
+
+ /**
+ * 设置开关机时间
+ * <p>
+ * 平台发送: [XT*YYYYYYYYYYYYYYY*LEN*BOOTOFF,
+ * 开关(0 关,1 开),开机时间,关机时间]
+ * 例:[XT*334588000000156*LEN* BOOTOFF,1,07:10,21:00]
+ *
+ * @param cmd
+ * @param data
+ * @param mRuntime
+ */
+ private void handleBOOTOFF(String cmd, String data, Runtime mRuntime) {
+ //解析数据
+ String[] split = data.split(CMDSPLIT);
+ if (split.length == 3) {
+ try {
+ //3部分内容
+ //1,07:10,21:00
+ String action = split[0];
+ String powerOnTime = split[1];
+ String powerOffTime = split[2];
+ ICLogger.d(" action==> " + action);
+ ICLogger.d(" powerOnTime==> " + powerOnTime);
+ ICLogger.d(" powerOffTime==> " + powerOffTime);
+ Context context = mRuntime.getContextProxy()
+ .context;
+ AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+ if (alarmManager == null) {
+ ICLogger.d("alarmManager is null...");
+ return;
+ }
+ Intent intent = new Intent(context, CoreService.class);
+ intent.setAction(ALARM_POWER_OFF);
+ PendingIntent pendingIntent = PendingIntent.getService(context,
+ 0, intent,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+ if (BOOT_OFF_ACTION_OFF.equals(action)) {
+ //取消闹钟
+ alarmManager.cancel(pendingIntent);
+ } else if (BOOT_OFF_ACTION_ON.equals(action)) {
+ String[] powerOffTimes = powerOffTime.split(":");
+ int hour = Integer.parseInt(powerOffTimes[0]);
+ int min = Integer.parseInt(powerOffTimes[0]);
+ intent.putExtra("hour", hour);
+ intent.putExtra("min", min);
+ AlarmHelper.setPowerOffAlarm(context, pendingIntent, hour, min);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ //无法实现定时开机
+ //可以实现定时关机
+ //TODO:设置一个闹钟,到了直接执行关机指令
+ }
+
//响铃和震动
private static final int PROFILE_MODE_RING_AND_VIBRATE = 1;
//响铃
AudioManager audioManager =
(AudioManager) mRuntime.getContextProxy()
.context.getSystemService(Context.AUDIO_SERVICE);
+ if (audioManager == null) {
+ ICLogger.d("audioManager == > is null");
+ return;
+ }
//对data进行判断
try {
int type = Integer.parseInt(data);