feat: 完成安卓端监控相关逻辑
This commit is contained in:
parent
af68801d1b
commit
3a85d42c02
@ -288,6 +288,10 @@
|
|||||||
import { deleteKeyRequest } from '@/api/key'
|
import { deleteKeyRequest } from '@/api/key'
|
||||||
import { transportType } from '@/constant/transportType'
|
import { transportType } from '@/constant/transportType'
|
||||||
|
|
||||||
|
// #ifdef APP-PLUS
|
||||||
|
import { requestPermission } from '@/uni_modules/xhj-record'
|
||||||
|
// #endif
|
||||||
|
|
||||||
const $bluetooth = useBluetoothStore()
|
const $bluetooth = useBluetoothStore()
|
||||||
const $basic = useBasicStore()
|
const $basic = useBasicStore()
|
||||||
const $lock = useLockStore()
|
const $lock = useLockStore()
|
||||||
@ -309,7 +313,18 @@
|
|||||||
await getServeTime()
|
await getServeTime()
|
||||||
})
|
})
|
||||||
|
|
||||||
const jumpToPlayer = () => {
|
const jumpToPlayer = async () => {
|
||||||
|
// #ifdef APP-PLUS
|
||||||
|
// 检查权限
|
||||||
|
const result = await requestPermission()
|
||||||
|
if (result.code !== 0) {
|
||||||
|
uni.showToast({
|
||||||
|
title: '请在设置中打开应用的麦克风权限',
|
||||||
|
icon: 'none'
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// #endif
|
||||||
$basic.routeJump({ name: 'p2pPlayer' })
|
$basic.routeJump({ name: 'p2pPlayer' })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -189,12 +189,12 @@
|
|||||||
// #ifdef APP-PLUS
|
// #ifdef APP-PLUS
|
||||||
import {
|
import {
|
||||||
startService,
|
startService,
|
||||||
getLiveUrl,
|
|
||||||
stopService,
|
stopService,
|
||||||
runSendService,
|
runSendService,
|
||||||
stopSendService,
|
stopSendService,
|
||||||
dataSend
|
dataSend
|
||||||
} from '@/uni_modules/xhj-tencent-xp2p'
|
} from '@/uni_modules/xhj-tencent-xp2p'
|
||||||
|
import { initAudio, onStartRecord, stopRecord, releaseRecord } from '@/uni_modules/xhj-record'
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
const $bluetooth = useBluetoothStore()
|
const $bluetooth = useBluetoothStore()
|
||||||
@ -229,9 +229,8 @@
|
|||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
// #ifdef APP-PLUS
|
// #ifdef APP-PLUS
|
||||||
|
initAudio()
|
||||||
isApp.value = true
|
isApp.value = true
|
||||||
// 初始化录音管理器
|
|
||||||
initRecorder()
|
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
// #ifdef MP-WEIXIN
|
// #ifdef MP-WEIXIN
|
||||||
@ -271,22 +270,13 @@
|
|||||||
xp2pInfo: deviceInfo.value.xp2pInfo
|
xp2pInfo: deviceInfo.value.xp2pInfo
|
||||||
})
|
})
|
||||||
if (result.code === 0) {
|
if (result.code === 0) {
|
||||||
setTimeout(async () => {
|
url.value = result.data.url
|
||||||
const urlResult = await getLiveUrl({
|
runSendService(
|
||||||
id: `${deviceInfo.value.productId}/${deviceInfo.value.deviceName}`
|
`${deviceInfo.value.productId}/${deviceInfo.value.deviceName}`,
|
||||||
})
|
'channel=0',
|
||||||
if (urlResult.code === 0) {
|
false
|
||||||
url.value = urlResult.data.url
|
)
|
||||||
runSendService(
|
handlePlaySuccess()
|
||||||
`${deviceInfo.value.productId}/${deviceInfo.value.deviceName}`,
|
|
||||||
'channel=0',
|
|
||||||
false
|
|
||||||
)
|
|
||||||
handlePlaySuccess()
|
|
||||||
} else {
|
|
||||||
$basic.backAndToast(message)
|
|
||||||
}
|
|
||||||
}, 200)
|
|
||||||
} else {
|
} else {
|
||||||
$basic.backAndToast(message)
|
$basic.backAndToast(message)
|
||||||
}
|
}
|
||||||
@ -299,10 +289,7 @@
|
|||||||
onUnload(() => {
|
onUnload(() => {
|
||||||
// #ifdef APP-PLUS
|
// #ifdef APP-PLUS
|
||||||
// 停止录音
|
// 停止录音
|
||||||
if (isVoice.value && recorderManager.value) {
|
releaseRecord()
|
||||||
stopRecording()
|
|
||||||
}
|
|
||||||
|
|
||||||
stopSendService(`${deviceInfo.value.productId}/${deviceInfo.value.deviceName}`)
|
stopSendService(`${deviceInfo.value.productId}/${deviceInfo.value.deviceName}`)
|
||||||
stopService({
|
stopService({
|
||||||
id: `${deviceInfo.value.productId}/${deviceInfo.value.deviceName}`
|
id: `${deviceInfo.value.productId}/${deviceInfo.value.deviceName}`
|
||||||
@ -480,104 +467,6 @@
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// #ifdef APP-PLUS
|
|
||||||
const recorderManager = ref(null)
|
|
||||||
const recordingFilePath = ref('')
|
|
||||||
// #endif
|
|
||||||
|
|
||||||
const convertAudioFileToUint8Array = filePath => {
|
|
||||||
// #ifdef APP-PLUS
|
|
||||||
try {
|
|
||||||
plus.io.resolveLocalFileSystemURL(filePath, entry => {
|
|
||||||
entry.file(
|
|
||||||
file => {
|
|
||||||
console.log('文件内容', file)
|
|
||||||
if (file.size === 0) return
|
|
||||||
|
|
||||||
const fileReader = new plus.io.FileReader()
|
|
||||||
|
|
||||||
fileReader.onloadend = async evt => {
|
|
||||||
try {
|
|
||||||
console.log(evt)
|
|
||||||
const base64 = evt.target.result.split(',')[1]
|
|
||||||
|
|
||||||
const binaryString = atob(base64)
|
|
||||||
const byteArray = []
|
|
||||||
|
|
||||||
for (let i = 0; i < binaryString.length; i++) {
|
|
||||||
byteArray[i] = binaryString.charCodeAt(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
const id = `${deviceInfo.value.productId}/${deviceInfo.value.deviceName}`
|
|
||||||
|
|
||||||
await dataSend(id, byteArray)
|
|
||||||
} catch (error) {
|
|
||||||
console.error('音频数据转换失败:', error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fileReader.onerror = () => {
|
|
||||||
console.error('音频文件读取失败')
|
|
||||||
}
|
|
||||||
|
|
||||||
fileReader.readAsDataURL(file)
|
|
||||||
},
|
|
||||||
error => console.error('获取文件对象失败:', error)
|
|
||||||
)
|
|
||||||
})
|
|
||||||
} catch (error) {
|
|
||||||
console.error('音频文件处理异常:', error)
|
|
||||||
}
|
|
||||||
// #endif
|
|
||||||
}
|
|
||||||
|
|
||||||
const initRecorder = () => {
|
|
||||||
// #ifdef APP-PLUS
|
|
||||||
recorderManager.value = uni.getRecorderManager()
|
|
||||||
|
|
||||||
recorderManager.value.onStart(() => {
|
|
||||||
console.log('录音开始')
|
|
||||||
})
|
|
||||||
|
|
||||||
recorderManager.value.onError(error => {
|
|
||||||
console.error('录音出错:', error)
|
|
||||||
})
|
|
||||||
|
|
||||||
recorderManager.value.onStop(res => {
|
|
||||||
console.log('录音结束:', res)
|
|
||||||
recordingFilePath.value = res.tempFilePath
|
|
||||||
|
|
||||||
convertAudioFileToUint8Array(res.tempFilePath)
|
|
||||||
})
|
|
||||||
// #endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// 开始录音
|
|
||||||
const startRecording = () => {
|
|
||||||
// #ifdef APP-PLUS
|
|
||||||
if (!recorderManager.value) {
|
|
||||||
initRecorder()
|
|
||||||
}
|
|
||||||
|
|
||||||
recorderManager.value.start({
|
|
||||||
duration: 60000,
|
|
||||||
sampleRate: 16000,
|
|
||||||
format: 'aac'
|
|
||||||
})
|
|
||||||
console.log('开始录音')
|
|
||||||
// #endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// 停止录音
|
|
||||||
const stopRecording = () => {
|
|
||||||
// #ifdef APP-PLUS
|
|
||||||
if (recorderManager.value) {
|
|
||||||
recorderManager.value.stop()
|
|
||||||
console.log('停止录音')
|
|
||||||
}
|
|
||||||
// #endif
|
|
||||||
}
|
|
||||||
|
|
||||||
const toggleVoice = () => {
|
const toggleVoice = () => {
|
||||||
// #ifdef MP-WEIXIN
|
// #ifdef MP-WEIXIN
|
||||||
if (isVoice.value) {
|
if (isVoice.value) {
|
||||||
@ -600,17 +489,19 @@
|
|||||||
// #ifdef APP-PLUS
|
// #ifdef APP-PLUS
|
||||||
if (isVoice.value) {
|
if (isVoice.value) {
|
||||||
isVoice.value = false
|
isVoice.value = false
|
||||||
|
stopRecord()
|
||||||
stopRecording()
|
|
||||||
} else {
|
} else {
|
||||||
uni.vibrateLong()
|
uni.vibrateLong()
|
||||||
isVoice.value = true
|
isVoice.value = true
|
||||||
// 初始化并开始录音
|
onStartRecord(callback)
|
||||||
startRecording()
|
|
||||||
}
|
}
|
||||||
// #endif
|
// #endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const callback = audioData => {
|
||||||
|
dataSend(`${deviceInfo.value.productId}/${deviceInfo.value.deviceName}`, audioData)
|
||||||
|
}
|
||||||
|
|
||||||
const handlePlaySuccess = () => {
|
const handlePlaySuccess = () => {
|
||||||
isVideoLoaded.value = true
|
isVideoLoaded.value = true
|
||||||
}
|
}
|
||||||
|
|||||||
83
uni_modules/xhj-record/package.json
Normal file
83
uni_modules/xhj-record/package.json
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
{
|
||||||
|
"id": "xhj-record",
|
||||||
|
"displayName": "xhj-record",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "xhj-record",
|
||||||
|
"keywords": [
|
||||||
|
"xhj-record"
|
||||||
|
],
|
||||||
|
"repository": "",
|
||||||
|
"engines": {
|
||||||
|
"HBuilderX": "^3.6.8"
|
||||||
|
},
|
||||||
|
"dcloudext": {
|
||||||
|
"type": "uts",
|
||||||
|
"sale": {
|
||||||
|
"regular": {
|
||||||
|
"price": "0.00"
|
||||||
|
},
|
||||||
|
"sourcecode": {
|
||||||
|
"price": "0.00"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contact": {
|
||||||
|
"qq": ""
|
||||||
|
},
|
||||||
|
"declaration": {
|
||||||
|
"ads": "",
|
||||||
|
"data": "",
|
||||||
|
"permissions": ""
|
||||||
|
},
|
||||||
|
"npmurl": ""
|
||||||
|
},
|
||||||
|
"uni_modules": {
|
||||||
|
"dependencies": [],
|
||||||
|
"encrypt": [],
|
||||||
|
"platforms": {
|
||||||
|
"cloud": {
|
||||||
|
"tcb": "u",
|
||||||
|
"aliyun": "u",
|
||||||
|
"alipay": "u"
|
||||||
|
},
|
||||||
|
"client": {
|
||||||
|
"Vue": {
|
||||||
|
"vue2": "u",
|
||||||
|
"vue3": "u"
|
||||||
|
},
|
||||||
|
"App": {
|
||||||
|
"app-android": "u",
|
||||||
|
"app-ios": "u",
|
||||||
|
"app-harmony": "u"
|
||||||
|
},
|
||||||
|
"H5-mobile": {
|
||||||
|
"Safari": "u",
|
||||||
|
"Android Browser": "u",
|
||||||
|
"微信浏览器(Android)": "u",
|
||||||
|
"QQ浏览器(Android)": "u"
|
||||||
|
},
|
||||||
|
"H5-pc": {
|
||||||
|
"Chrome": "u",
|
||||||
|
"IE": "u",
|
||||||
|
"Edge": "u",
|
||||||
|
"Firefox": "u",
|
||||||
|
"Safari": "u"
|
||||||
|
},
|
||||||
|
"小程序": {
|
||||||
|
"微信": "u",
|
||||||
|
"阿里": "u",
|
||||||
|
"百度": "u",
|
||||||
|
"字节跳动": "u",
|
||||||
|
"QQ": "u",
|
||||||
|
"钉钉": "u",
|
||||||
|
"快手": "u",
|
||||||
|
"飞书": "u",
|
||||||
|
"京东": "u"
|
||||||
|
},
|
||||||
|
"快应用": {
|
||||||
|
"华为": "u",
|
||||||
|
"联盟": "u"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
package="io.dcloud.nativeresouce">
|
||||||
|
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||||
|
<application>
|
||||||
|
<!--meta-data-->
|
||||||
|
</application>
|
||||||
|
</manifest>
|
||||||
3
uni_modules/xhj-record/utssdk/app-android/config.json
Normal file
3
uni_modules/xhj-record/utssdk/app-android/config.json
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"minSdkVersion": "21"
|
||||||
|
}
|
||||||
209
uni_modules/xhj-record/utssdk/app-android/index.uts
Normal file
209
uni_modules/xhj-record/utssdk/app-android/index.uts
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
// @ts-nocheck
|
||||||
|
// @ts-ignore-start
|
||||||
|
import 'android.media.AudioRecord'
|
||||||
|
import 'android.media.MediaRecorder'
|
||||||
|
import 'android.media.AudioFormat'
|
||||||
|
import 'android.media.MediaSyncEvent'
|
||||||
|
import 'java.lang.Thread'
|
||||||
|
import { UTSAndroid } from 'io.dcloud.uts'
|
||||||
|
import { Result } from '../interface.uts'
|
||||||
|
|
||||||
|
let recorder: AudioRecord | null = null
|
||||||
|
let recorderState: boolean = false
|
||||||
|
let bufferSizeInBytes: Int = 0
|
||||||
|
|
||||||
|
export const requestPermission = async function (): Promise<Result> {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
try {
|
||||||
|
let permissionNeed = ['android.permission.RECORD_AUDIO']
|
||||||
|
|
||||||
|
UTSAndroid.requestSystemPermission(
|
||||||
|
UTSAndroid.getUniActivity()!,
|
||||||
|
permissionNeed,
|
||||||
|
function (allRight: boolean, _: string[]) {
|
||||||
|
if (allRight) {
|
||||||
|
resolve({
|
||||||
|
code: 0,
|
||||||
|
data: {},
|
||||||
|
message: '成功'
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
resolve({
|
||||||
|
code: -1,
|
||||||
|
data: {},
|
||||||
|
message: '失败'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
function (_: boolean, _: string[]) {
|
||||||
|
resolve({
|
||||||
|
code: -1,
|
||||||
|
data: {},
|
||||||
|
message: '失败'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
} catch (error) {
|
||||||
|
resolve({
|
||||||
|
code: -1,
|
||||||
|
data: {},
|
||||||
|
message: error.toString()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const initAudio = async function (): Promise<Result> {
|
||||||
|
try {
|
||||||
|
const audioSource = MediaRecorder.AudioSource.MIC
|
||||||
|
const sampleRateInHz = 44100
|
||||||
|
const channelConfig = AudioFormat.CHANNEL_IN_MONO
|
||||||
|
const audioFormat = AudioFormat.ENCODING_PCM_16BIT
|
||||||
|
|
||||||
|
bufferSizeInBytes = AudioRecord.getMinBufferSize(
|
||||||
|
sampleRateInHz.toInt(),
|
||||||
|
channelConfig,
|
||||||
|
audioFormat
|
||||||
|
)
|
||||||
|
|
||||||
|
console.log('bufferSizeInBytes', bufferSizeInBytes)
|
||||||
|
|
||||||
|
recorder = new AudioRecord(
|
||||||
|
audioSource,
|
||||||
|
sampleRateInHz.toInt(),
|
||||||
|
channelConfig,
|
||||||
|
audioFormat,
|
||||||
|
bufferSizeInBytes
|
||||||
|
)
|
||||||
|
|
||||||
|
const currentRecorder = recorder
|
||||||
|
if (currentRecorder !== null) {
|
||||||
|
console.log('初始化录音结果:', currentRecorder.getState())
|
||||||
|
if (currentRecorder.getState() == AudioRecord.STATE_INITIALIZED) {
|
||||||
|
return {
|
||||||
|
code: 0,
|
||||||
|
data: {},
|
||||||
|
message: '成功'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
code: -1,
|
||||||
|
data: {},
|
||||||
|
message: '初始化录音失败'
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log('初始化录音失败', error)
|
||||||
|
return {
|
||||||
|
code: -1,
|
||||||
|
data: {},
|
||||||
|
message: error.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function onStartRecord(callback: (data: Array) => void): Promise<Result> {
|
||||||
|
try {
|
||||||
|
const callbackFunction = () => {
|
||||||
|
const currentRecorder = recorder
|
||||||
|
if (currentRecorder !== null) {
|
||||||
|
while (recorderState) {
|
||||||
|
let audioData = new ByteArray(bufferSizeInBytes)
|
||||||
|
const result: Int = currentRecorder.read(audioData, 0, bufferSizeInBytes)
|
||||||
|
if (result > 0) {
|
||||||
|
callback(Array.fromNative(audioData))
|
||||||
|
console.log('录音按帧返回数据', Array.fromNative(audioData))
|
||||||
|
}
|
||||||
|
Thread.sleep(10)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const currentRecorder = recorder
|
||||||
|
if (currentRecorder !== null) {
|
||||||
|
currentRecorder.startRecording()
|
||||||
|
console.log('开始录音')
|
||||||
|
recorderState = true
|
||||||
|
|
||||||
|
callbackFunction()
|
||||||
|
|
||||||
|
return {
|
||||||
|
code: 0,
|
||||||
|
data: {},
|
||||||
|
message: '成功'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
code: -1,
|
||||||
|
data: {},
|
||||||
|
message: '开始录音失败'
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log('开始录音失败', error)
|
||||||
|
return {
|
||||||
|
code: -1,
|
||||||
|
data: {},
|
||||||
|
message: error.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const stopRecord = async function (): Promise<Result> {
|
||||||
|
try {
|
||||||
|
const currentRecorder = recorder
|
||||||
|
if (currentRecorder !== null) {
|
||||||
|
currentRecorder.stop()
|
||||||
|
recorderState = false
|
||||||
|
console.log('停止录音')
|
||||||
|
return {
|
||||||
|
code: 0,
|
||||||
|
data: {},
|
||||||
|
message: '成功'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
code: -1,
|
||||||
|
data: {},
|
||||||
|
message: '停止录音失败'
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log('停止录音失败', error)
|
||||||
|
recorderState = false
|
||||||
|
return {
|
||||||
|
code: -1,
|
||||||
|
data: {},
|
||||||
|
message: error.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const releaseRecord = async function (): Promise<Result> {
|
||||||
|
try {
|
||||||
|
const currentRecorder = recorder
|
||||||
|
if (currentRecorder !== null) {
|
||||||
|
currentRecorder.release()
|
||||||
|
console.log('释放录音')
|
||||||
|
return {
|
||||||
|
code: 0,
|
||||||
|
data: {},
|
||||||
|
message: '成功'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
code: -1,
|
||||||
|
data: {},
|
||||||
|
message: '释放录音失败'
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log('释放录音失败', error)
|
||||||
|
return {
|
||||||
|
code: -1,
|
||||||
|
data: {},
|
||||||
|
message: error.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// @ts-ignore-end
|
||||||
5
uni_modules/xhj-record/utssdk/interface.uts
Normal file
5
uni_modules/xhj-record/utssdk/interface.uts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export type Result = {
|
||||||
|
code: number
|
||||||
|
data: object
|
||||||
|
message: string
|
||||||
|
}
|
||||||
@ -1,7 +1,69 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
// @ts-nocheck
|
||||||
|
// @ts-ignore-start
|
||||||
|
|
||||||
import { UTSAndroid } from 'io.dcloud.uts'
|
import { UTSAndroid } from 'io.dcloud.uts'
|
||||||
import { XP2PAppConfig, XP2P } from 'com.tencent.xnet'
|
import { XP2PAppConfig, XP2P, XP2PCallback } from 'com.tencent.xnet'
|
||||||
import { Result, InitParams, IdParams } from '../interface.uts'
|
import { Result, InitParams, IdParams } from '../interface.uts'
|
||||||
|
|
||||||
|
class XP2PCallbackImpl extends XP2PCallback {
|
||||||
|
private eventNotifyCallback?: (id: string | null, msg: string | null, event: Int) => void
|
||||||
|
|
||||||
|
constructor(eventNotifyCallback?: (id: string | null, msg: string | null, event: Int) => void) {
|
||||||
|
super()
|
||||||
|
this.eventNotifyCallback = eventNotifyCallback
|
||||||
|
}
|
||||||
|
|
||||||
|
override fail(msg: string | null, errorCode: Int): void {
|
||||||
|
console.log('XP2P callback fail:', msg, errorCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
override commandRequest(id: string | null, msg: string | null): void {
|
||||||
|
console.log('XP2P callback commandRequest:', id, msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
override xp2pEventNotify(id: string | null, msg: string | null, event: Int): void {
|
||||||
|
console.log('XP2P callback xp2pEventNotify:', id, msg, event)
|
||||||
|
this.eventNotifyCallback?.invoke(id, msg, event)
|
||||||
|
}
|
||||||
|
|
||||||
|
override avDataRecvHandle(id: string | null, data: ByteArray | null, len: Int): void {
|
||||||
|
console.log('XP2P callback avDataRecvHandle:', id, len)
|
||||||
|
}
|
||||||
|
|
||||||
|
override avDataCloseHandle(id: string | null, msg: string | null, errorCode: Int): void {
|
||||||
|
console.log('XP2P callback avDataCloseHandle:', id, msg, errorCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
override onDeviceMsgArrived(id: string | null, data: ByteArray | null, len: Int): string {
|
||||||
|
console.log('XP2P callback onDeviceMsgArrived:', id, len)
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getLiveUrlAsync(
|
||||||
|
id: string,
|
||||||
|
resolve: (result: Result) => void,
|
||||||
|
reject: (result: Result) => void
|
||||||
|
): Promise<void> {
|
||||||
|
try {
|
||||||
|
const liveUrl = await XP2P.delegateHttpFlv(id)
|
||||||
|
resolve({
|
||||||
|
code: 0,
|
||||||
|
data: {
|
||||||
|
url: liveUrl
|
||||||
|
},
|
||||||
|
message: '成功'
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
reject({
|
||||||
|
code: -1,
|
||||||
|
data: {},
|
||||||
|
message: error.toString()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export const startService = async function (params: InitParams): Promise<Result> {
|
export const startService = async function (params: InitParams): Promise<Result> {
|
||||||
try {
|
try {
|
||||||
const context = UTSAndroid.getAppContext()
|
const context = UTSAndroid.getAppContext()
|
||||||
@ -19,31 +81,17 @@ export const startService = async function (params: InitParams): Promise<Result>
|
|||||||
xp2pConfig
|
xp2pConfig
|
||||||
)
|
)
|
||||||
|
|
||||||
return {
|
return new Promise<Result>((resolve, reject) => {
|
||||||
code: 0,
|
const callback: XP2PCallback = new XP2PCallbackImpl(
|
||||||
data: {},
|
(id: string | null, msg: string | null, event: Int): void => {
|
||||||
message: '成功'
|
if (event == 1004) {
|
||||||
}
|
getLiveUrlAsync(id!, resolve, reject)
|
||||||
} catch (error) {
|
}
|
||||||
return {
|
}
|
||||||
code: -1,
|
)
|
||||||
data: {},
|
|
||||||
message: error.toString()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const getLiveUrl = async function (params: IdParams): Promise<Result> {
|
XP2P.setCallback(callback)
|
||||||
try {
|
})
|
||||||
const liveUrl = await XP2P.delegateHttpFlv(params.id)
|
|
||||||
|
|
||||||
return {
|
|
||||||
code: 0,
|
|
||||||
data: {
|
|
||||||
url: liveUrl
|
|
||||||
},
|
|
||||||
message: '成功'
|
|
||||||
}
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return {
|
return {
|
||||||
code: -1,
|
code: -1,
|
||||||
@ -70,13 +118,6 @@ export const stopService = async function (params: IdParams): Promise<Result> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// export const setCallback = function (callback: XP2PCallback) {
|
|
||||||
// try {
|
|
||||||
// XP2P.setCallback(callback)
|
|
||||||
// } catch (error) {
|
|
||||||
// console.log(2, error)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
export const runSendService = async function (
|
export const runSendService = async function (
|
||||||
id: string,
|
id: string,
|
||||||
cmd: string,
|
cmd: string,
|
||||||
@ -119,31 +160,15 @@ export const stopSendService = async function (id: string): Promise<Result> {
|
|||||||
|
|
||||||
export const dataSend = async function (id: string, data: Array<number>): Promise<Result> {
|
export const dataSend = async function (id: string, data: Array<number>): Promise<Result> {
|
||||||
try {
|
try {
|
||||||
let byteTest = new ByteArray(data.length.toInt())
|
let byteArray = new ByteArray(data.length.toInt())
|
||||||
// byteTest.set(0, (0xff).toByte())
|
|
||||||
// byteTest.set(1, (0xf9).toByte())
|
|
||||||
|
|
||||||
// let profile = 2
|
|
||||||
// let freqIdx = 8
|
|
||||||
// let chanCfg = 1
|
|
||||||
// let packetLen = data.length + 7
|
|
||||||
|
|
||||||
// byteTest.set(2, (((profile - 1) << 6) + (freqIdx << 2) + (chanCfg >> 2)).toByte())
|
|
||||||
// byteTest.set(3, (((chanCfg & 3) << 6) + (packetLen >> 11)).toByte())
|
|
||||||
// byteTest.set(4, ((packetLen & 0x7ff) >> 3).toByte())
|
|
||||||
// byteTest.set(5, (((packetLen & 7) << 5) + 0x1f).toByte())
|
|
||||||
// byteTest.set(6, (0xfc).toByte())
|
|
||||||
|
|
||||||
for (let i = 0; i < data.length; i++) {
|
for (let i = 0; i < data.length; i++) {
|
||||||
byteTest.set(i.toInt(), data[i].toByte())
|
byteArray.set(i.toInt(), data[i].toByte())
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(byteTest)
|
const result = await XP2P.dataSend(id, byteArray, data.length.toInt())
|
||||||
console.log(1, id, byteTest[0], byteTest[1], data.length.toInt())
|
|
||||||
|
|
||||||
const result = await XP2P.dataSend(id, byteTest, data.length.toInt())
|
console.log('发送数据结果', result, byteArray)
|
||||||
|
|
||||||
console.log('发送数据', result)
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
code: 0,
|
code: 0,
|
||||||
@ -158,3 +183,5 @@ export const dataSend = async function (id: string, data: Array<number>): Promis
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @ts-ignore-end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user