diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dcbc14ba..3a26f9ff 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -256,6 +256,11 @@ + + + + + "" } - val msgInfo = MsgInfo("sms", from, message, Date(), simInfo, simSlot, subscription) + val msgInfo = MsgInfo("sms", from, msg, Date(), simInfo, simSlot, subscription) Log.d(TAG, "msgInfo = $msgInfo") val request = OneTimeWorkRequestBuilder().setInputData( @@ -146,55 +145,54 @@ class SmsReceiver : BroadcastReceiver() { SmsCommandUtils.execute(context, smsCommand) } - private fun parseMMSContent(data: String, sender: String?) { - // 在这里实现解析彩信内容的逻辑 - Log.d("MMSReceiver", "Received MMS from: $sender, Data: $data") + private fun handleMmsData(context: Context, data: ByteArray) { + try { + val mmsClass = Class.forName("android.telephony.gsm.SmsMessage") + val method = mmsClass.getDeclaredMethod("createFromPdu", ByteArray::class.java) + val pdus = arrayOf(data) + val messages = mutableListOf() - val parts = data.split("\n\n") // 假设彩信内容以两个换行符 "\n\n" 分隔不同部分 - parts.forEach { part -> - val lines = part.split("\n") - var contentType: String? = null - var content: String? = null - var contentTransferEncoding: String? = null - - lines.forEach { line -> - Log.d(TAG, "Line: $line") - val keyValue = line.split(":") - if (keyValue.size == 2) { - val key = keyValue[0].trim() - val value = keyValue[1].trim() - - when (key.toLowerCase()) { - "content-type" -> contentType = value - "content-transfer-encoding" -> contentTransferEncoding = value - } - } + for (pdu in pdus) { + val message = method.invoke(null, pdu) + message?.let { messages.add(it) } } - // 处理不同 MIME 类型的内容 - contentType?.let { - when { - it.startsWith("text") -> { - // 文本内容 - content = lines.last() // 假设文本内容在当前部分的最后一行 - // 处理文本内容,例如展示在 TextView 中 - Log.d(TAG, "Text data: $content") - } + // 处理 MMS 中的各个部分 + for (message in messages) { + // 获取 MMS 的各个部分 + val parts = message.javaClass.getMethod("getParts").invoke(message) as? Array<*> - it.startsWith("image") -> { - // 图片内容 - // 如果 contentTransferEncoding 表示 base64 编码 - if (contentTransferEncoding.equals("base64", true)) { - content = lines.last() // 假设图片数据在当前部分的最后一行 - // 解码图片数据并展示或保存图片 - val decodedImage = android.util.Base64.decode(content, android.util.Base64.DEFAULT) - // 处理解码后的图片数据 - Log.d(TAG, "Image data: $decodedImage") + // 遍历 MMS 的各个部分 + parts?.forEach { part -> + // 获取部分的内容类型 + val contentType = part?.javaClass?.getMethod("getContentType")?.invoke(part) as? String + + // 处理文本部分 + if (contentType?.startsWith("text/plain") == true) { + val text = part.javaClass.getMethod("getData").invoke(part) as? String + // 处理文本信息 + if (text != null) { + Log.d(TAG, "Text: $text") + msg += text } } - // 可以根据其他 MIME 类型继续添加处理逻辑,比如视频、音频等 + + // 处理图像部分 + if (contentType?.startsWith("image/") == true) { + val imageData = part.javaClass.getMethod("getData").invoke(part) as? ByteArray + // 处理图像信息 + if (imageData != null) { + // 在这里你可以保存图像数据或进行其他处理 + Log.d(TAG, "Image data received") + } + } + + // 其他部分的处理可以根据需要继续扩展 } } + + } catch (e: Exception) { + e.printStackTrace() } }