From: TrillGates Date: Fri, 9 Apr 2021 12:21:35 +0000 (+0800) Subject: completed alarm power off. X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=9f8d96b676419db2bb7b5ad72b4446d7c11f1429;p=protocol_srv.git completed alarm power off. --- diff --git a/app/src/main/java/com/enqualcomm/support/Constants.java b/app/src/main/java/com/enqualcomm/support/Constants.java index adcfabbb..4ca2376c 100644 --- a/app/src/main/java/com/enqualcomm/support/Constants.java +++ b/app/src/main/java/com/enqualcomm/support/Constants.java @@ -232,6 +232,7 @@ public interface Constants { String OTHER_ALARM_END = "com.enqualcomm.support.OTHER_ALARM_END"; String OTHER_ALARM_START = "com.enqualcomm.support.OTHER_ALARM_START"; + String ALARM_POWER_OFF = "com.ic.power.ACTION_ALARM_POWER_OFF"; String OTHER_HEARTRATE_ALARM_END = "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_END"; diff --git a/app/src/main/java/com/enqualcomm/support/CoreService.java b/app/src/main/java/com/enqualcomm/support/CoreService.java index d03d73a8..a243d173 100644 --- a/app/src/main/java/com/enqualcomm/support/CoreService.java +++ b/app/src/main/java/com/enqualcomm/support/CoreService.java @@ -85,6 +85,7 @@ import static com.enqualcomm.support.Constants.ACTION_LOCATION_ALARM; 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; @@ -1338,6 +1339,26 @@ public class CoreService extends Service { 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); diff --git a/app/src/main/java/com/enqualcomm/support/utils/AlarmHelper.java b/app/src/main/java/com/enqualcomm/support/utils/AlarmHelper.java index 8ade8f1d..34527d41 100644 --- a/app/src/main/java/com/enqualcomm/support/utils/AlarmHelper.java +++ b/app/src/main/java/com/enqualcomm/support/utils/AlarmHelper.java @@ -20,7 +20,7 @@ public class AlarmHelper { private static final long ONE_WEEK = 604800000L; private static Method setImpl; - + static { try { setImpl = AlarmManager.class.getDeclaredMethod("setImpl", new Class[]{int.class, long.class, long.class, long.class, PendingIntent.class, android.os.WorkSource.class}); @@ -96,7 +96,7 @@ public class AlarmHelper { public static void setRealTimeAlarmInSeconds(Context context, int seconds, String actionname) { AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - Intent intent = new Intent(context, com.enqualcomm.support.CoreService.class); + Intent intent = new Intent(context, CoreService.class); intent.setAction(actionname); PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager.cancel(pendingIntent); @@ -108,11 +108,13 @@ public class AlarmHelper { alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, l + (seconds * 1000), pendingIntent); } - public static void setTimeAlarm(Context context, int hour, int minutes, String paramString) { + public static void setTimeAlarm(Context context, int hour, int minutes, String action) { AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - Intent intent = new Intent(context, com.enqualcomm.support.CoreService.class); - intent.setAction(paramString); - PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); + Intent intent = new Intent(context, CoreService.class); + intent.setAction(action); + PendingIntent pendingIntent = PendingIntent.getService(context, + 0, intent, + PendingIntent.FLAG_UPDATE_CURRENT); long l3 = System.currentTimeMillis(); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, hour); @@ -126,6 +128,24 @@ public class AlarmHelper { alarmManager.setExact(AlarmManager.RTC_WAKEUP, l1, pendingIntent); } + + public static void setPowerOffAlarm(Context context, PendingIntent pendingIntent, int hour, int min) { + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + long l3 = System.currentTimeMillis(); + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, hour); + calendar.set(Calendar.MINUTE, min); + calendar.set(Calendar.SECOND, 0); + long l2 = calendar.getTimeInMillis(); + long l1 = l2; + if (l2 < l3) + l1 = l2 + ONE_DAY; + alarmManager.cancel(pendingIntent); + //设置闹钟 + alarmManager.setExact(AlarmManager.RTC_WAKEUP, l1, pendingIntent); + } + + public static void setNextWeekAlarm(AlarmManager mAlarmManager, long timeStamp, PendingIntent pendingIntent) { //周期为下一周 timeStamp += ONE_WEEK; diff --git a/app/src/main/java/com/ic/protocols/protocol_fzd.java b/app/src/main/java/com/ic/protocols/protocol_fzd.java index 5be328e7..c499443b 100644 --- a/app/src/main/java/com/ic/protocols/protocol_fzd.java +++ b/app/src/main/java/com/ic/protocols/protocol_fzd.java @@ -3,6 +3,8 @@ package com.ic.protocols; 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; @@ -39,6 +41,7 @@ import com.enqualcomm.support.provider.FZDMembersProvider; 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; @@ -61,6 +64,7 @@ import java.util.Date; 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; @@ -420,7 +424,7 @@ public class protocol_fzd { TALK,//向对方发起音视频聊天 UNKNOWN_CMD, MESSAGE/*文字消息*/, - profile//情景模式 + profile,//情景模式 } private static HashMap cmdMap = null; @@ -1262,7 +1266,6 @@ public class protocol_fzd { } public void handlePOWEROFF(Connection connection) { - connection.send(POWEROFF()); } @@ -1459,19 +1462,24 @@ public class protocol_fzd { 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); @@ -1480,12 +1488,14 @@ public class protocol_fzd { 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); @@ -1499,8 +1509,9 @@ public class protocol_fzd { case POWEROFF: //收到关机 handlePOWEROFF(mConnection); - ICLogger.i("收到服务器关机命令BP31"); - mConnection.DeliverCMDMessageToSystem("poweroff", cmd);//通知下面线程状态变化 + ICLogger.i("收到服务器关机命令POWEROFF"); + //通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("poweroff", cmd); break; case hrtstart: handleHrtstart(mConnection); @@ -1554,7 +1565,8 @@ public class protocol_fzd { case FIND: //收到查找设备消息 handleFIND(mConnection); - mConnection.DeliverCMDMessageToSystem("findDev", cmd);//通知下面线程状态变化 + //通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("findDev", cmd); break; case MESSAGE: handleMESSAGE(mConnection, data); @@ -1666,12 +1678,78 @@ public class protocol_fzd { 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; + + + /** + * 设置开关机时间 + *

+ * 平台发送: [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; //响铃 @@ -1696,6 +1774,10 @@ public class protocol_fzd { 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);