159 lines
4.9 KiB
Plaintext
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;
|
|
}
|
|
}
|