2024-06-04 11:19:22 +08:00

159 lines
4.9 KiB
Plaintext

/*
* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import mediaLibrary from '@ohos.multimedia.mediaLibrary';
import DateTimeUtil from './DateTimeUtil';
type FileInfo = {
prefix: string;
suffix: string;
directory: number;
};
export default class MediaModel {
private static mediaInstance: MediaModel = undefined;
private mediaLibraryTest: mediaLibrary.MediaLibrary = undefined;
constructor() {
this.mediaLibraryTest = mediaLibrary.getMediaLibrary(globalThis.cameraContext);
}
public static getMediaInstance(): MediaModel {
if (this.mediaInstance === undefined) {
this.mediaInstance = new MediaModel();
}
return this.mediaInstance;
}
async createAndGetUri(mediaType: mediaLibrary.MediaType, fileName): Promise<mediaLibrary.FileAsset> {
let dateTimeUtil: DateTimeUtil = new DateTimeUtil();
let info: FileInfo = this.getInfoFromMediaType(mediaType);
let name: string = `${dateTimeUtil.getDate()}_${dateTimeUtil.getTime()}`;
let displayName: string = fileName ? fileName : `${info.prefix}${name}${info.suffix}`;
let publicPath: string = await this.mediaLibraryTest.getPublicDirectory(
info.directory
);
let fileAsset: mediaLibrary.FileAsset = await this.mediaLibraryTest.createAsset(
mediaType,
displayName,
publicPath
);
return fileAsset;
}
async getFile(dataUri: mediaLibrary.FileAsset): Promise<mediaLibrary.FileAsset> {
let fileKeyObj = mediaLibrary.FileKey;
if (dataUri !== undefined) {
let args = dataUri.id.toString();
let fetchOp = {
selections: `${fileKeyObj.ID}=?`,
selectionArgs: [args],
};
const fetchFileResult: mediaLibrary.FetchFileResult = await this.mediaLibraryTest.getFileAssets(
fetchOp
);
const fileAssets = await fetchFileResult.getAllObject();
let fileAsset: mediaLibrary.FileAsset = fileAssets[0];
return fileAsset;
}
return null;
}
async getFdPath(fileAsset: mediaLibrary.FileAsset): Promise<number> {
let fd: number = await fileAsset.open('Rw');
return fd;
}
async getFileAssetsFromMediaType(mediaType: number): Promise<Array<mediaLibrary.FileAsset>> {
let fileKeyObj = mediaLibrary.FileKey;
let fileAssets: Array<mediaLibrary.FileAsset> = [];
try {
let fetchOp = {
selections: `${fileKeyObj.MEDIA_TYPE}=?`,
selectionArgs: [`${mediaType}`],
};
const fetchFileResult: mediaLibrary.FetchFileResult = await this.mediaLibraryTest.getFileAssets(
fetchOp
);
if (fetchFileResult.getCount() > 0) {
fileAssets = await fetchFileResult.getAllObject();
}
} catch (err) {
console.info(`LSQ: err ${JSON.stringify(err)}`);
}
return fileAssets;
}
onDateChange(callback: () => void): void {
this.mediaLibraryTest.on('albumChange', () => {
callback();
});
this.mediaLibraryTest.on('imageChange', () => {
callback();
});
this.mediaLibraryTest.on('audioChange', () => {
callback();
});
this.mediaLibraryTest.on('videoChange', () => {
callback();
});
this.mediaLibraryTest.on('fileChange', () => {
callback();
});
}
offDateChange(): void {
this.mediaLibraryTest.off('albumChange');
this.mediaLibraryTest.off('imageChange');
this.mediaLibraryTest.off('audioChange');
this.mediaLibraryTest.off('videoChange');
this.mediaLibraryTest.off('fileChange');
}
getInfoFromMediaType(mediaType: mediaLibrary.MediaType): FileInfo {
let fileInfo: FileInfo = {
prefix: '',
suffix: '',
directory: 0
};
switch (mediaType) {
case mediaLibrary.MediaType.FILE:
fileInfo.prefix = 'FILE_';
fileInfo.suffix = '.txt';
fileInfo.directory = mediaLibrary.DirectoryType.DIR_DOCUMENTS;
break;
case mediaLibrary.MediaType.IMAGE:
fileInfo.prefix = 'IMG_';
fileInfo.suffix = '.jpg';
fileInfo.directory = mediaLibrary.DirectoryType.DIR_IMAGE;
break;
case mediaLibrary.MediaType.VIDEO:
fileInfo.prefix = 'VID_';
fileInfo.suffix = '.mp4';
fileInfo.directory = mediaLibrary.DirectoryType.DIR_VIDEO;
break;
case mediaLibrary.MediaType.AUDIO:
fileInfo.prefix = 'AUD_';
fileInfo.suffix = '.wav';
fileInfo.directory = mediaLibrary.DirectoryType.DIR_AUDIO;
break;
}
return fileInfo;
}
}