From 4c3fcf45f6014ca26e8fc9107eef917753ebbfd7 Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Fri, 24 Nov 2023 17:18:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=BD=A9=E4=BF=A1?= =?UTF-8?q?=E8=BD=AC=E5=8F=91=E5=8A=9F=E8=83=BD=EF=BC=88TODO:=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E5=BD=A9=E4=BF=A1=EF=BC=89=20#351?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 5 + .../sms/forwarder/receiver/CallReceiver.kt | 1 - .../forwarder/receiver/SimStateReceiver.kt | 5 +- .../sms/forwarder/receiver/SmsReceiver.kt | 120 +++++++++--------- 4 files changed, 66 insertions(+), 65 deletions(-) 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() } }