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
相关产品推荐
相关产品推荐

