
摘要
随着智能设备越来越多,如何让手机、电视、音响等设备之间"互通有无"成为刚需。传统做法往往依赖蓝牙、Wi-Fi 直连等方式,但配置繁琐、效率不高。而鸿蒙系统基于分布式技术,天然支持多设备协同,让文件共享这件事变得更简单。这篇文章就来带你看看如何用鸿蒙实现设备间的文件共享,包括核心思路、可运行代码,以及实际场景下的应用示范。
引言
想象一个场景:你在手机上下载了一部电影,回家之后想用电视看,只需要拖拽或点一下就能无感投送;再比如你用平板拍摄照片,手机立刻就能收到。鸿蒙的分布式文件共享能力让这些变得现实。
目前鸿蒙支持多种设备协同共享,底层通过分布式文件系统、数据流、权限管理等一整套机制完成设备感知、内容发现与权限认证。
下面我们就来拆解这些机制,并给出实际的开发方式和代码。
核心能力解析:鸿蒙的文件共享原理
分布式文件系统(Distributed File System)
鸿蒙的分布式文件系统(DFS)允许设备将本地存储虚拟为一个共享目录,供其它可信设备访问。
分布式数据流
基于多种传输协议(如 Wi-Fi、蓝牙、NFC),可以实时传输文件、媒体内容,提升协同体验。
分布式权限管理
每一个跨设备调用都会经过用户授权、系统认证,保证安全性。你可以配置哪些设备可以访问哪些文件。
如何实现设备间文件共享
下面我们通过 ArkTS 编写一个简单的 Demo,实现两个鸿蒙设备之间的图片共享功能。
创建共享文件服务端(发送端)
ts
// FileSender.ets
import fileio from '@ohos.fileio';
import distributedFile from '@ohos.distributedFile';
@Entry
@Component
struct FileSender {
private filePath: string = '/data/user/0/ohos.share/pic.jpg';
private deviceId: string = ''; // 目标设备 ID
async shareFile() {
try {
let deviceList = await distributedFile.getTrustedDeviceList();
if (deviceList.length === 0) {
console.error('没有找到可信设备');
return;
}
this.deviceId = deviceList[0].deviceId;
const remoteUri = `distributed://${this.deviceId}/shared/pic.jpg`;
const fileData = await fileio.readFile(this.filePath);
await distributedFile.writeFile(remoteUri, fileData);
console.info('文件共享成功');
} catch (err) {
console.error('共享失败:', err);
}
}
build() {
Column() {
Button("点击共享图片")
.onClick(() => this.shareFile())
}
}
}
创建共享文件接收端(接收端)
ts
// FileReceiver.ets
import distributedFile from '@ohos.distributedFile';
import fileio from '@ohos.fileio';
@Entry
@Component
struct FileReceiver {
private filePath: string = '/data/user/0/ohos.shared/pic.jpg';
async readSharedFile() {
try {
const fileData = await distributedFile.readFile(this.filePath);
await fileio.writeFile('/data/user/0/ohos.saved/received.jpg', fileData);
console.info('文件接收并保存成功');
} catch (err) {
console.error('接收失败:', err);
}
}
build() {
Column() {
Button("读取共享图片")
.onClick(() => this.readSharedFile())
}
}
}
实际场景中的应用与示例
场景一:手机与电视共享视频播放
你在手机上选择一个视频,选择"共享到电视",电视立即接收到文件并用内置播放器播放。
ts
const targetDevice = await distributedFile.getTrustedDeviceByName("SmartTV");
const videoPath = '/data/user/0/ohos.videos/demo.mp4';
await distributedFile.sendFileToDevice(videoPath, targetDevice.deviceId);
场景二:拍照实时同步到平板
平板和手机同时登录同一账户,拍照后图片自动同步。
ts
// 监听本地图库文件夹变化并触发共享
watch('/storage/pictures', async (event) => {
if (event.type === 'create') {
const file = event.filePath;
const device = await distributedFile.getTrustedDeviceByName("MyPad");
await distributedFile.sendFileToDevice(file, device.deviceId);
}
});
场景三:多人协同白板应用
多个设备间共享绘图内容,如白板笔记、标注内容等,每个用户在自己设备上操作,其他设备实时同步内容。
ts
// 使用分布式数据库或流式同步 API 同步 JSON 数据结构
let drawingData = {
type: "line",
start: { x: 10, y: 10 },
end: { x: 100, y: 100 },
color: "#000"
};
await distributedFile.broadcastToTrustedDevices(JSON.stringify(drawingData));
QA 环节
Q1:设备间共享是否需要同一网络? A:不完全需要,但推荐在同一个局域网内,发现速度更快,传输更稳定。
Q2:权限怎么控制? A:鸿蒙通过系统弹窗授权、设备认证、用户同意来控制跨设备访问权限。开发者可以限制可连接设备。
Q3:是否支持大文件传输? A:支持,但推荐进行分片或流式传输,避免内存溢出。
Q4:支持跨品牌共享吗? A:只要设备是基于鸿蒙系统,并支持分布式能力,即可跨品牌协同。
总结
鸿蒙系统提供的分布式能力大大简化了设备间的文件共享开发。通过分布式文件系统、数据流、权限控制等一整套机制,可以实现高效、安全的跨设备文件传输。实际开发中,你只需要关注业务逻辑,鸿蒙已经帮你打通设备连接的"最后一公里"。
无论是家庭娱乐、办公协同还是智能家居控制,鸿蒙的文件共享能力都能派上用场。如果你还没试过,不妨现在就动手做个 Demo 玩玩看吧!