filePicker代码整改

Signed-off-by: 李伟康 <917651607@qq.com>
This commit is contained in:
李伟康
2024-08-04 16:37:35 +08:00
parent 7bad1b3533
commit 515c0fd44e
7 changed files with 60 additions and 93 deletions
@@ -19,21 +19,18 @@ import abilityAccessCtrl from '@ohos.abilityAccessCtrl'
import { Permissions } from '@ohos.abilityAccessCtrl'
import FileShare from '@ohos.fileshare'
import wantConstant from '@ohos.app.ability.wantConstant'
import ErrorCodeConst from '../constants/ErrorCodeConst'
import MediaLibrary from '@ohos.multimedia.mediaLibrary'
import { FILE_MANAGER_PREFERENCES, FILE_SUFFIX, SELECT_MODE } from '../constants/Constant'
import StringUtil from './StringUtil'
import { ArrayUtil } from './ArrayUtil'
import { getPreferences } from './PreferencesUtil'
import { ability, Want } from '@kit.AbilityKit'
import { StartModeOptions } from '../model/StartModeOptions'
import ctx from '@ohos.app.ability.common';
import { PickerWindowType } from '../constants/FilePickerItems'
import { photoAccessHelper } from '@kit.MediaLibraryKit'
const TAG = 'AbilityCommonUtil'
const BUNDLE_NAME = 'com.ohos.filepicker'
let mediaLibrary: MediaLibrary.MediaLibrary = null
let photoManageHelper: photoAccessHelper.PhotoAccessHelper = null
/**
* picker对外返回的响应码
@@ -103,7 +100,7 @@ namespace AbilityCommonUtil {
*/
export function init(): Promise<void[]> {
const fileAccessHelperPromise = createFileAccessHelper();
getMediaLibrary();
getPhotoManageHelper();
const getRequestPermission = requestPermission();
const initData = initLastSelectPath();
return Promise.all([fileAccessHelperPromise, getRequestPermission, initData]);
@@ -383,23 +380,23 @@ namespace AbilityCommonUtil {
/**
* 获取媒体库对象实例的统一接口
*/
export function getMediaLibrary(): MediaLibrary.MediaLibrary {
if (!mediaLibrary) {
export function getPhotoManageHelper(): photoAccessHelper.PhotoAccessHelper {
if (!photoManageHelper) {
try {
mediaLibrary = MediaLibrary.getMediaLibrary(globalThis.abilityContext)
photoManageHelper = photoAccessHelper.getPhotoAccessHelper(globalThis.abilityContext)
} catch (error) {
Logger.e(TAG, 'getMediaLibrary fail, error:' + JSON.stringify(error))
Logger.e(TAG, 'getPhotoManageHelper fail, error:' + JSON.stringify(error))
}
}
return mediaLibrary
return photoManageHelper
}
export function releaseMediaLibrary(): void {
if (!mediaLibrary) {
export function releasePhotoManageHelper(): void {
if (!photoManageHelper) {
try {
mediaLibrary.release()
photoManageHelper.release()
} catch (error) {
Logger.e(TAG, 'releaseMediaLibrary fail, error: ' + JSON.stringify(error))
Logger.e(TAG, 'releasePhotoManageHelper fail, error: ' + JSON.stringify(error))
}
}
}
+1 -4
View File
@@ -18,14 +18,11 @@ import prompt from '@ohos.prompt';
import { getResourceString } from './Tools';
import { MILLISECOND, FILENAME_REGEXP } from '../constants/Constant';
import Logger from '../log/Logger';
import MediaLibrary from '@ohos.multimedia.mediaLibrary';
const TAG = 'commonUtil';
let mediaLibrary: MediaLibrary.MediaLibrary = null;
export const toast = (text: string | Resource, time = MILLISECOND.ONE_SECOND) => {
let resourceString = undefined;
let resourceString: string | undefined = undefined;
if (typeof text !== 'string') {
resourceString = getResourceString(text);
} else {
+3 -6
View File
@@ -19,9 +19,9 @@ import ObjectUtil from './ObjectUtil';
import Logger from '../log/Logger';
import StringUtil from './StringUtil';
import { FILENAME_MAX_LENGTH, RENAME_CONNECT_CHARACTER } from '../constants/Constant';
import MediaLibrary from '@ohos.multimedia.mediaLibrary';
import fs from '@ohos.file.fs';
import FileUri from '@ohos.file.fileuri';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
const TAG = 'FileUtil';
@@ -213,12 +213,9 @@ export class FileUtil {
return { code: code, uri: uri };
}
public static async hardDelete(uri: string, mediaLibrary: MediaLibrary.MediaLibrary): Promise<boolean> {
if (ObjectUtil.isNullOrUndefined(mediaLibrary)) {
return false;
}
public static async hardDelete(uri: string): Promise<boolean> {
try {
await mediaLibrary.deleteAsset(uri);
await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(globalThis.abilityContext , [uri]);
return true;
} catch (e) {
Logger.e(TAG, 'hardDelete error: ' + JSON.stringify(e));
@@ -13,19 +13,18 @@
* limitations under the License.
*/
import MediaLibrary from '@ohos.multimedia.mediaLibrary';
import { MILLISECOND } from '../../base/constants/Constant';
import { formatSuffix, getResourceString } from '../../base/utils/Tools';
import DateTimeUtil from '../../base/utils/DateTimeUtil';
import { FileMimeTypeUtil } from '../../base/utils/FileMimeTypeUtil';
import LanguageUtil from '../../base/utils/LanguageUtil';
import ErrorCodeConst from '../../base/constants/ErrorCodeConst';
import { MimeType } from './MimeType';
import { THUMBNAIL_SIZE } from '../../base/constants/UiConstant';
import { BasicDataSource } from './BasicDataSource';
import Logger from '../../base/log/Logger';
import AbilityCommonUtil, { ResultCodePicker } from '../../base/utils/AbilityCommonUtil';
import { StartModeOptions } from '../../base/model/StartModeOptions';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { dataSharePredicates } from '@kit.ArkData';
const TAG = 'FileAssetModel';
@@ -203,12 +202,12 @@ function sortFileAssetList(dataList) {
* 媒体库查询条件类
*/
export class MediaFetchOptions {
public selections: string = MediaLibrary.FileKey.MEDIA_TYPE + '=?';
public selections: string = photoAccessHelper.PhotoKeys.PHOTO_TYPE + '=?';
public selectionArgs: string[] = [];
public order: string = MediaLibrary.FileKey.DATE_MODIFIED + ' DESC';
public uri: string;
public networkId: string;
public extendArgs: string;
public order: string = photoAccessHelper.PhotoKeys.DATE_MODIFIED + ' DESC';
public uri: string = '';
public networkId: string = '';
public extendArgs: string = '';
constructor(mediaTypeArg: string = '') {
if (!mediaTypeArg) {
@@ -230,7 +229,7 @@ export class MediaFetchOptions {
* @param selection 要查询的关键字
* @param selectionArg 要查询的值
*/
addSelection(selection: MediaLibrary.FileKey, selectionArg: string) {
addSelection(selection: photoAccessHelper.PhotoKeys, selectionArg: string) {
if (this.selections.length) {
this.selections += ` AND ${selection} = ? `;
} else {
@@ -245,65 +244,46 @@ export class MediaFetchOptions {
* @param mediaFetchOptions 媒体库查询条件
* @return 文件列表
*/
export function getMediaFileAssets(mediaFetchOptions: MediaFetchOptions): Promise<FileAssetModel[]> {
const mediaLibrary = AbilityCommonUtil.getMediaLibrary();
if (!mediaLibrary) {
return Promise.resolve([]);
export async function getMediaFileDuration(mediaFetchOptions: MediaFetchOptions): Promise<number> {
const photoManageHelper: photoAccessHelper.PhotoAccessHelper = AbilityCommonUtil.getPhotoManageHelper();
let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
let fetchOptions: photoAccessHelper.FetchOptions = {
fetchColumns: mediaFetchOptions.selectionArgs,
predicates: predicates
};
if (!photoManageHelper) {
return 0;
}
return mediaLibrary.getFileAssets(mediaFetchOptions).then((fetchFileResult: MediaLibrary.FetchFileResult) => {
return fetchFileResult.getAllObject().then((fileAssetList: MediaLibrary.FileAsset[]) => {
let newFileAssetList = [];
fileAssetList.forEach(fileAsset => {
newFileAssetList.push(new FileAssetModel(fileAsset));
});
newFileAssetList = addSortLabel(newFileAssetList);
newFileAssetList = sortFileAssetList(newFileAssetList);
return newFileAssetList;
}).catch((err) => {
// 媒体库查询为空code返回3
if (err.code === ErrorCodeConst.FILE_ACCESS.GET_MEDIAFILE_NULL) {
Logger.e(TAG, 'no media file');
return [];
}
return Promise.reject(err);
}).finally(() => {
fetchFileResult.close();
})
}).catch((err) => {
return Promise.reject(err);
let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await photoManageHelper.getAssets(fetchOptions)
let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
let duration: photoAccessHelper.MemberType = photoAsset.get(photoAccessHelper.PhotoKeys.DURATION);
return Number(duration) ?? 0;
}
export function getDurationByUri(mediaType: photoAccessHelper.PhotoType, uri: string): Promise<number> {
const option = new MediaFetchOptions(mediaType.toString());
option.setUri(uri);
return getMediaFileDuration(option).then((res: number) => {
return res;
}).catch(() => {
return 0;
})
}
/**
* 根据文件名(后缀)判断媒体类型
* @param fileName 文件名
* @return 媒体类型MediaLibrary.MediaType
* @return 媒体类型photoAccessHelper.PhotoType
*/
export function getMediaType(fileName: string): MediaLibrary.MediaType {
export function getMediaType(fileName: string): photoAccessHelper.PhotoType {
const mimeType = FileMimeTypeUtil.getFileMimeType(fileName);
if (mimeType.isImage()) {
return MediaLibrary.MediaType.IMAGE;
return photoAccessHelper.PhotoType.IMAGE;
} else if (mimeType.isVideo()) {
return MediaLibrary.MediaType.VIDEO;
} else if (mimeType.isAudio()) {
return MediaLibrary.MediaType.AUDIO;
return photoAccessHelper.PhotoType.VIDEO;
} else {
return MediaLibrary.MediaType.FILE;
}
}
export function getDurationByUri(mediaType: MediaLibrary.MediaType, uri: string): Promise<number> {
const option = new MediaFetchOptions(mediaType.toString());
option.setUri(uri);
return getMediaFileAssets(option).then((res) => {
if (res && res.length) {
return res[0].duration;
} else {
return 0;
}
}).catch(() => {
return 0;
})
}
}
/**
@@ -52,7 +52,7 @@ export default class MainAbility extends UIAbility {
onDestroy() {
Logger.i(TAG, 'onDestroy')
AbilityCommonUtil.releaseMediaLibrary()
AbilityCommonUtil.releasePhotoManageHelper()
}
onWindowStageCreate(windowStage: window.WindowStage) {
+5 -10
View File
@@ -22,12 +22,12 @@ import { SYSTEM_BAR_COLOR } from '../base/constants/UiConstant';
import StringUtil from '../base/utils/StringUtil';
import { FileUtil } from '../base/utils/FileUtil';
import ObjectUtil from '../base/utils/ObjectUtil';
import MediaLibrary from '@ohos.multimedia.mediaLibrary';
import fileAccess from '@ohos.file.fileAccess';
import { ArrayUtil } from '../base/utils/ArrayUtil';
import { UiUtil } from '../base/utils/UiUtil';
import { StartModeOptions } from '../base/model/StartModeOptions';
import { FilePickerUtil } from '../base/utils/FilePickerUtil';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
const TAG = 'PathSelector';
let storage = LocalStorage.getShared();
@@ -123,20 +123,15 @@ struct PathSelector {
Logger.i(TAG, 'saveFiles err: ' + result.err.code);
// 失败
resultErr = { code: result.err.code, message: result.err.message };
let mediaLibrary;
try {
mediaLibrary = MediaLibrary.getMediaLibrary(globalThis.abilityContext);
} catch (error) {
Logger.e(TAG, 'getMediaLibrary fail, error:' + JSON.stringify(error));
}
if (ObjectUtil.isNullOrUndefined(mediaLibrary)) {
let photoManageHelper: photoAccessHelper.PhotoAccessHelper = AbilityCommonUtil.getPhotoManageHelper();
if (ObjectUtil.isNullOrUndefined(photoManageHelper)) {
break;
}
for (let i = 0; i < successArr.length; i++) {
await FileUtil.hardDelete(successArr[i], mediaLibrary);
await FileUtil.hardDelete(successArr[i]);
}
try {
mediaLibrary.release();
photoManageHelper.release();
} catch (e) {
Logger.e(TAG, 'mediaLibrary close error');
}
@@ -35,6 +35,7 @@ import { FileUtil } from '../../../base/utils/FileUtil';
import fileAccess from '@ohos.file.fileAccess';
import { StartModeOptions } from '../../../base/model/StartModeOptions';
import { FilePickerUtil } from '../../../base/utils/FilePickerUtil';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
const TAG = 'myPhone';
let storage = LocalStorage.getShared();
@@ -172,10 +173,10 @@ struct MyPhone {
this.getVideoAudioDuration(fileList);
}
async getVideoAudioDuration(fileList) {
async getVideoAudioDuration(fileList: FilesData[]) {
const videoAudioList = fileList.filter(item => item.mimeTypeObj.isVideo() || item.mimeTypeObj.isAudio());
for (let item of videoAudioList) {
const mediaType = getMediaType(item.fileName);
const mediaType: photoAccessHelper.PhotoType = getMediaType(item.fileName);
await getDurationByUri(mediaType, item.uri).then((duration) => {
item.duration = duration;
let index = this.fileListSource.getIndex(item.uri);