手机版本碰一碰发视频源码搭建技术开发,支持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),对于大视频文件,需采用分片传输策略:

  1. 将视频文件分割为多个 4KB 以内的数据块
  1. 每个数据块添加分片索引和总片数
  1. 接收方重组数据块为完整文件

核心分片代码示例:

/**

* 视频文件分片

*/

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 常见问题解决方案

  1. 传输距离过近:调整 NFC 天线功率参数,在 AndroidManifest.xml 中添加:

<meta-data

android:name="android.nfc.extra.POWER_LEVEL"

android:value="high" />

  1. 传输中断:实现断点续传机制,记录已传输分片索引,支持从中断处继续传输。
  1. 格式不兼容:增加多格式支持,兼容常见视频格式(MP4、MOV、AVI 等)的 MIME 类型声明。

六、总结与扩展

本文实现的手机端碰一碰发视频功能,通过 NFC 技术实现了便捷的视频分享体验。开发者可基于此基础进行扩展:

  • 集成视频压缩功能,减少传输数据量
  • 添加加密模块,保障视频传输安全性
  • 结合蓝牙辅助传输,实现大文件高速传输

随着 NFC 技术的不断发展,该功能在线下社交、新零售、教育等领域将有更广阔的应用前景。完整源码已上传至 GitHub(仓库地址:github.com/nfcdemo/video-share),欢迎开发者交流优化。

posted @ 2025-08-02 20:09  wzzkaifa  阅读(121)  评论(0)    收藏  举报