手机版本碰一碰发视频源码搭建技术开发,支持OEM - 实践
在移动互联时代,近场通信(NFC)技术的应用愈发广泛,手机端 “碰一碰发视频” 功能凭借其便捷性,成为社交分享、商业推广等场景的新宠。本文将从技术原理出发,详细讲解手机版本碰一碰发视频功能的源码搭建过程,为开发者提供可落地的技术方案。

一、技术原理与核心组件
手机端碰一碰发视频功能基于 NFC 技术实现,核心是通过 NFC 芯片完成设备间的近距离数据交互。当两部支持 NFC 的手机贴近时,发起方将视频数据(或视频链接)封装成 NDEF 格式消息,通过 NFC 控制器发送至接收方,接收方解析消息后执行相应操作(播放视频或跳转链接)。
核心技术组件包括:

- NFC 硬件模块:手机内置的 NFC 芯片及天线,负责射频信号的收发。
- NDEF 数据格式:NFC 数据交换的标准格式,支持文本、URI、智能海报等多种记录类型。
- Android NFC 框架:提供 NfcAdapter、NdefMessage、NdefRecord 等 API,简化 NFC 功能开发。
- 视频数据处理模块:负责视频文件的压缩、分片及传输校验。
二、开发环境配置
2.1 基础环境要求
- 开发工具:Android Studio 4.0+
- 目标 SDK 版本:Android 6.0(API 23)及以上(需动态申请 NFC 权限)
- 测试设备:两部支持 NFC 功能的 Android 手机(建议 Android 7.0+)
- 依赖库:
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.9.0'
}
2.2 权限配置
在 AndroidManifest.xml 中添加 NFC 权限及相关配置:
<!-- 声明NFC权限 -->
<uses-permission android:name="android.permission.NFC" />
<!-- 声明NFC功能需求 -->
<uses-feature
android:name="android.hardware.nfc"
android:required="true" />
<application ...>
<activity
android:name=".NfcVideoShareActivity"
...>
<!-- 配置NFC过滤意图 -->
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/vnd.android.nfc-ndef-video" />
</intent-filter>
</activity>
</application>
三、核心功能模块开发
3.1 NFC 适配器初始化
在 Activity 中初始化 NFC 适配器,检查设备 NFC 状态:
class NfcVideoShareActivity : AppCompatActivity() {
private var nfcAdapter: NfcAdapter? = null
private lateinit var pendingIntent: PendingIntent
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_nfc_video_share)
// 初始化NFC适配器
nfcAdapter = NfcAdapter.getDefaultAdapter(this)
if (nfcAdapter == null) {
Toast.makeText(this, "设备不支持NFC", Toast.LENGTH_SHORT).show()
finish()
return
}
// 检查NFC是否开启
if (!nfcAdapter!!.isEnabled) {
val intent = Intent(Settings.ACTION_NFC_SETTINGS)
startActivity(intent)
}
// 创建PendingIntent,用于处理NFC意图
pendingIntent = PendingIntent.getActivity(
this, 0,
Intent(this, javaClass).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
PendingIntent.FLAG_IMMUTABLE
)
}
}
3.2 视频数据封装为 NDEF 消息
将视频文件路径或网络链接封装成 NDEF 消息,关键代码如下:
/**
* 构建视频分享的NDEF消息
* @param videoPath 本地视频路径或网络视频URL
*/
private fun createVideoNdefMessage(videoPath: String): NdefMessage {
val mimeType = MimeType("application/vnd.android.nfc-ndef-video")
val videoBytes = videoPath.toByteArray(Charsets.UTF_8)
val record = NdefRecord.createMime(mimeType.type, videoBytes)
return NdefMessage(arrayOf(record))
}
3.3 发送方实现(数据推送)
发送方通过设置 NDEF 消息回调,实现触碰时自动发送数据:
override fun onResume() {
super.onResume()
// 设置NDEF消息推送回调
nfcAdapter?.setNdefPushMessageCallback(
NfcAdapter.CreateNdefMessageCallback {
// 此处替换为实际视频路径或URL
val videoPath = "/sdcard/Download/demo.mp4"
createVideoNdefMessage(videoPath)
}, this
)
// 启用前台调度系统
nfcAdapter?.enableForegroundDispatch(this, pendingIntent, null, null)
}
override fun onPause() {
super.onPause()
// 禁用前台调度系统
nfcAdapter?.disableForegroundDispatch(this)
}
3.4 接收方实现(数据解析)
接收方在 onNewIntent 方法中处理接收到的 NFC 数据:
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.let { rawMessages ->
val messages = rawMessages.map { it as NdefMessage }
processNdefMessages(messages)
}
}
}
/**
* 处理接收到的NDEF消息
*/
private fun processNdefMessages(messages: List<NdefMessage>) {
messages.forEach { message ->
message.records.forEach { record ->
if (record.mimeType == "application/vnd.android.nfc-ndef-video") {
val videoPath = String(record.payload, Charsets.UTF_8)
handleReceivedVideo(videoPath)
}
}
}
}
/**
* 处理接收到的视频信息
*/
private fun handleReceivedVideo(videoPath: String) {
if (videoPath.startsWith("http")) {
// 网络视频,跳转播放器
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(videoPath))
intent.setDataAndType(Uri.parse(videoPath), "video/*")
startActivity(intent)
} else {
// 本地视频,检查文件是否存在
val file = File(videoPath)
if (file.exists()) {
val intent = Intent(Intent.ACTION_VIEW)
val uri = FileProvider.getUriForFile(
this,
"${packageName}.fileprovider",
file
)
intent.setDataAndType(uri, "video/*")
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
startActivity(intent)
} else {
Toast.makeText(this, "视频文件不存在", Toast.LENGTH_SHORT).show()
}
}
}
四、进阶优化方案
4.1 大文件分片传输
由于 NFC 单次传输数据量有限(通常小于 4KB),对于大视频文件,需采用分片传输策略:
- 将视频文件分割为多个 4KB 以内的数据块
- 每个数据块添加分片索引和总片数
- 接收方重组数据块为完整文件
核心分片代码示例:
/**
* 视频文件分片
*/
private fun splitVideoFile(file: File): List<ByteArray> {
val chunkSize = 4096 // 4KB分片
val fileSize = file.length().toInt()
val chunks = mutableListOf<ByteArray>()
val buffer = ByteArray(chunkSize)
FileInputStream(file).use { fis ->
var bytesRead: Int
var chunkIndex = 0
val totalChunks = (fileSize + chunkSize - 1) / chunkSize
while (fis.read(buffer).also { bytesRead = it } != -1) {
val chunkData = ByteArray(bytesRead + 8) // 预留8字节存储索引和总片数
// 写入索引和总片数
ByteBuffer.wrap(chunkData, 0, 4).putInt(chunkIndex)
ByteBuffer.wrap(chunkData, 4, 4).putInt(totalChunks)
// 写入文件数据
System.arraycopy(buffer, 0, chunkData, 8, bytesRead)
chunks.add(chunkData)
chunkIndex++
}
}
return chunks
}
4.2 传输进度反馈
通过 ProgressDialog 实现传输进度展示:
private val progressDialog by lazy {
ProgressDialog(this).apply {
setTitle("传输中")
setMessage("正在发送视频...")
setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
max = 100
setCancelable(false)
}
}
// 在发送过程中更新进度
private fun updateProgress(progress: Int) {
runOnUiThread {
progressDialog.progress = progress
if (progress == 100) {
progressDialog.dismiss()
Toast.makeText(this, "发送成功", Toast.LENGTH_SHORT).show()
}
}
}
五、测试与兼容性处理
5.1 测试场景覆盖
- 基础功能测试:验证近距离触碰能否成功传输视频信息
- 边界测试:测试超大视频文件(>1GB)的分片传输稳定性
- 兼容性测试:在不同品牌(华为、小米、OPPO 等)、不同 Android 版本(6.0-14.0)的设备上验证功能
5.2 常见问题解决方案
- 传输距离过近:调整 NFC 天线功率参数,在 AndroidManifest.xml 中添加:
<meta-data
android:name="android.nfc.extra.POWER_LEVEL"
android:value="high" />
- 传输中断:实现断点续传机制,记录已传输分片索引,支持从中断处继续传输。
- 格式不兼容:增加多格式支持,兼容常见视频格式(MP4、MOV、AVI 等)的 MIME 类型声明。
六、总结与扩展
本文实现的手机端碰一碰发视频功能,通过 NFC 技术实现了便捷的视频分享体验。开发者可基于此基础进行扩展:
- 集成视频压缩功能,减少传输数据量
- 添加加密模块,保障视频传输安全性
- 结合蓝牙辅助传输,实现大文件高速传输
随着 NFC 技术的不断发展,该功能在线下社交、新零售、教育等领域将有更广阔的应用前景。完整源码已上传至 GitHub(仓库地址:github.com/nfcdemo/video-share),欢迎开发者交流优化。


浙公网安备 33010602011771号