在 Activity 中初始化 NFCAdapter,设置前台调度系统,以便及时响应 NFC 设备的触碰事件。
// 初始化NFC适配器
NFCAdapter nfcAdapter = NFCAdapter.getDefaultAdapter(this);
if (nfcAdapter == null) {
// 设备不支持NFC,给出提示
Toast.makeText(this, "设备不支持NFC", Toast.LENGTH_SHORT).show();
finish();
}
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
IntentFilter[] intentFilters = new IntentFilter[]{};
String[][] techLists = new String[][]{{NfcF.class.getName()}};
nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFilters, techLists);
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, PICK_VIDEO_REQUEST);
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_VIDEO_REQUEST && resultCode == RESULT_OK && data!= null) {
Uri selectedVideoUri = data.getData();
String videoPath = getRealPathFromURI(selectedVideoUri);
// 准备视频传输相关操作
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (tag!= null) {
// 获取目标设备IP等信息
String destinationIp = getDeviceIp(tag);
try {
Socket socket = new Socket(destinationIp, destinationPort);
FileInputStream fis = new FileInputStream(videoFile);
BufferedInputStream bis = new BufferedInputStream(fis);
OutputStream os = socket.getOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = bis.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
bis.close();
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// Toast提示
Toast.makeText(this, "设备配对成功", Toast.LENGTH_SHORT).show();
// ProgressBar展示传输进度
progressBar.setMax(totalFileSize);
progressBar.setProgress(0);
new Thread(() -> {
try {
// 视频传输代码
runOnUiThread(() -> progressBar.setProgress(progress));
} catch (IOException e) {
e.printStackTrace();
}
}).start();
// 震动反馈
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(100);
import CoreNFC
class ViewController: UIViewController, NFCNDEFReaderSessionDelegate {
var readerSession: NFCNDEFReaderSession?
override func viewDidLoad() {
super.viewDidLoad()
readerSession = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: false)
}
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
// 处理NFC设备信息
}
}
let picker = UIImagePickerController()
picker.sourceType =.photoLibrary
picker.mediaTypes = [kUTTypeMovie as String]
picker.delegate = self
present(picker, animated: true, completion: nil)
extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let videoUrl = info[.mediaURL] as? URL {
// 准备视频传输相关操作
}
dismiss(animated: true, completion: nil)
}
}
let socket = Socket.createUDPSocket()
let videoData = try! Data(contentsOf: videoUrl)
let packetSize = 1024
for i in 0..
let startIndex = videoData.startIndex.advanced(by: i * packetSize)
let endIndex = videoData.startIndex.advanced(by: (i + 1) * packetSize)
let packet = videoData[startIndex..
socket.send(packet, to: destinationAddress)
}
let remainingPacket = videoData[videoData.startIndex.advanced(by: (videoData.count / packetSize) * packetSize)..
socket.send(remainingPacket, to: destinationAddress)
// 提示框
let alert = UIAlertController(title: "设备配对成功", message: nil, preferredStyle:.alert)
present(alert, animated: true, completion: nil)
// 进度条
progressView.progress = 0
DispatchQueue.global(qos:.background).async {
// 视频传输代码
DispatchQueue.main.async {
progressView.progress = Float(progress) / Float(totalFileSize)
}
}
// 震动音效模拟震动
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
通过以上步骤,我们能够成功搭建短视频 NFC 碰一碰发视频的源码系统。在实际开发过程中,需根据具体需求和场景,对代码进行灵活调整与优化,为用户提供更加流畅、便捷的视频分享体验。希望本文能为广大开发者在实现这一创新功能时提供有益的参考与帮助。
你对短视频 NFC 碰一碰发视频源码搭建技术文章的期待?要是你对代码示例、技术细节有更深入的疑问,或者希望看到更多优化与拓展方向的内容,都能向我提出 。