You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android技术问题:如何在应用间传递Bundle?短信发送加密数据异常求助

解决Android短信发送Bundle无法在默认短信应用显示的问题

嘿,这个问题我之前做类似加密短信应用时也踩过坑,咱们来理清楚问题根源和解决办法~

为什么Bundle没法通过短信正常显示?

默认短信应用是基于标准SMS/MMS协议工作的,而Bundle是Android系统内部的序列化对象,它本质是二进制数据,短信协议并不支持直接传输这种非文本/标准格式的内容。不仅默认短信应用解析不了,接收方的其他应用也没法直接读取这个Bundle,所以自然看不到内容。

可行的解决方案

根据你的需求,这里有几种实用的思路:

1. 将密钥和密文转为文本格式嵌入短信内容

这是最直接的方案,把二进制的key和ciphertext用Base64编码转成字符串,然后用自定义格式拼接成短信内容,这样默认短信应用能正常显示文本,接收方的应用再解析这段文本提取数据。

发送方示例代码(Kotlin):

import android.util.Base64
import android.content.Intent
import android.net.Uri

// 假设key和ciphertext是ByteArray类型的加密数据
val keyBase64 = Base64.encodeToString(key, Base64.NO_WRAP) // 用NO_WRAP避免换行干扰解析
val ciphertextBase64 = Base64.encodeToString(ciphertext, Base64.NO_WRAP)

// 自定义短信内容格式,方便后续解析
val smsContent = "MY_ENCRYPT_MSG::KEY=$keyBase64::CIPHER=$ciphertextBase64"

// 启动短信发送Intent
val sendIntent = Intent(Intent.ACTION_SENDTO).apply {
    data = Uri.parse("smsto:${目标手机号}")
    putExtra("sms_body", smsContent)
}
startActivity(sendIntent)

接收方解析逻辑:
当你的应用收到短信时,先判断内容是否以MY_ENCRYPT_MSG::开头,然后按自定义分隔符::拆分字符串,提取出key和ciphertext的Base64字符串,再解码回ByteArray即可。

2. 用MMS发送加密数据附件

如果不想让用户看到明文的编码内容,可以把key和ciphertext写入一个加密的文本文件,作为MMS附件发送。默认短信应用会显示附件提示,用户点击后可以用你的应用打开。

注意: 这种方式需要申请SEND_SMS、SEND_MMS权限,还要配置FileProvider来共享文件避免权限问题。

示例代码片段:

import android.content.Intent
import android.net.Uri
import androidx.core.content.FileProvider
import java.io.File
import java.io.FileOutputStream

// 创建临时文件存储加密数据
val tempFile = File(context.cacheDir, "encrypted_payload.txt")
FileOutputStream(tempFile).use { output ->
    // 可以用分隔符区分key和ciphertext,比如换行
    output.write(key)
    output.write('\n'.toByte())
    output.write(ciphertext)
}

// 获取文件的Content Uri(需要在AndroidManifest配置FileProvider)
val fileUri = FileProvider.getUriForFile(
    context,
    "${context.packageName}.fileprovider", // 自定义的authority
    tempFile
)

// 发送MMS的Intent
val sendIntent = Intent(Intent.ACTION_SEND).apply {
    type = "text/plain"
    putExtra(Intent.EXTRA_STREAM, fileUri)
    putExtra("address", 目标手机号)
    putExtra("sms_body", "这是一条加密消息,请使用我的密码学应用查看附件")
    addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授予读取权限
}
startActivity(sendIntent)

3. 直接通过应用间Intent传递(非短信通道)

如果双方都安装了你的应用,可以跳过短信应用,直接用隐式Intent启动接收方的特定Activity,把Bundle直接传递过去。这种方式更高效,但依赖双方都有你的应用。

额外提醒

  • 短信传输本身是不安全的,即使加密了内容,也要确保密钥的分发安全(比如用其他安全通道提前交换密钥)。
  • Base64编码时要保持发送方和接收方的参数一致(比如都用NO_WRAP),避免解码失败。

内容的提问来源于stack exchange,提问作者JMarotta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:10:06