概要
概述一下需求,安卓手机通过USB连接电脑,web端通过 webusb API 操作 adb命令 与安卓手机通信,读写安卓手机文件数据(可以实现,删除App 下载App 获取文件路径的数据)。
引入依赖
此处使用了 第三方组件库
ya-webadbhttps://app.tangoapp.dev/guide文档地址
https://tango-adb.github.io/docs/
import { AdbDaemonWebUsbDeviceManager } from '@yume-chan/adb-daemon-webusb'
import AdbWebCredentialStore from '@yume-chan/adb-credential-web'
import { AdbDaemonTransport } from '@yume-chan/adb'
import { Adb } from '@yume-chan/adb'
import { WritableStream } from '@yume-chan/stream-extra'
usb连接
usb插入后,选择你需要连接的设备 !
/**
* 连接设备读取指定路径文件
*/
const Manager = AdbDaemonWebUsbDeviceManager.BROWSER
const openUSB = async () => {
const device = await Manager.requestDevice()
if (!device) {
alert('No device selected')
return
}
const connection = await device.connect()
const CredentialStore = new AdbWebCredentialStore()
const transport = await AdbDaemonTransport.authenticate({
serial: device.serial,
connection,
credentialStore: CredentialStore,
})
const adb = new Adb(transport)
const sync = await adb.sync()
// 获取文件数据
let dataChunks = []
const content = sync.read('/storage/emulated/0/DCIM/Camera/test.jpg')
await content.pipeTo(
new WritableStream({
write(chunk) {
dataChunks.push(chunk)
},
})
)
/**
* 关闭连接
* tips: 获取完数据后 一定要关闭 不然会造成内存泄漏
*/
await sync.dispose()
// 拿到最终的完整图片数据
const imageData = onDataReceived(dataChunks)
console.log('==>', imageData);
}
读取指定路径文件
这里是获取指定路径的数据 我这里去获取了图片,然后循环 push到数组里的 因为这里拿到的是分片的数据,不是全部的,受到usb传输速率的影响。
// 获取文件数据
let dataChunks = []
const content = sync.read('/storage/emulated/0/DCIM/Camera/test.jpg')
await content.pipeTo(
new WritableStream({
write(chunk) {
dataChunks.push(chunk)
},
})
)
合并 uint8Array 数据
// 创建图片 URL
function onDataReceived(uint8Arrays) {
let combinedArray = combineUint8Arrays(uint8Arrays)
// 转换为 Blob
let blob = new Blob([combinedArray], { type: 'image/jpeg' })
// 创建图片 URL
let imageUrl = URL.createObjectURL(blob)
// 图片地址
return imageUrl
}
// 合并 uint8Array 数据
function combineUint8Arrays(arrays) {
let totalLength = arrays.reduce((acc, value) => acc + value.length, 0)
let combined = new Uint8Array(totalLength)
let offset = 0
for (let arr of arrays) {
combined.set(arr, offset)
offset += arr.length
}
return combined
}