1# 文件子系统ChangeLog 2 3## cl.file.1 mediaLibrary相关接口兼容性变更 4 5mediaLibrary部分接口兼容性变更。 6 7**变更影响** 8 9[mediaLibrary](../../../application-dev/reference/apis/js-apis-medialibrary.md)部分接口兼容性变更。 10基于此前版本开发的应用,需注意接口的迭代更新。 11 12**关键接口/组件变更** 13 14| 模块名 | 方法/属性/枚举/常量 | 变更类型 | 15| ------------------------- | ------------------------------------------------------------ | -------- | 16| medialibrary | **function** getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileResult>): void | 接口兼容性变更 | 17| medialibrary | **function** getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult> | 接口兼容性变更 | 18| medialibrary | **function** createAsset(mediaType: MediaType, displayName: string, relativePath: string, callback: AsyncCallback<FileAsset>): void| 接口兼容性变更 | 19| medialibrary | **function** createAsset(mediaType: MediaType, displayName: string, relativePath: string): Promise<FileAsset>| 接口兼容性变更 | 20| medialibrary | **function** getAlbums(options: MediaFetchOptions, callback: AsyncCallback<Array<Album>>): void | 接口兼容性变更 | 21| medialibrary | **function** getAlbums(options: MediaFetchOptions): Promise<Array<Album>> | 接口兼容性变更 | 22| medialibrary | **function** FileAsset.commitModify(callback: AsyncCallback<void>): void | 接口兼容性变更 | 23| medialibrary | **function** FileAsset.commitModify(): Promise<void> | 接口兼容性变更 | 24| medialibrary | **function** FileAsset.deleteAsset(uri: string, callback: AsyncCallback<void>): void | 接口兼容性变更 | 25| medialibrary | **function** FileAsset.deleteAsset(uri: string): Promise<void> | 接口兼容性变更 | 26 27**适配指导** 28 29**getFileAssets接口获取文件资源兼容性影响:** 30 31在API version 10上,摒弃了物理目录作为相册的设计,采用了逻辑相册的设计,一个相册中可以添加多个文件,一个文件也可以在多个相册中呈现。新的设计将带来parent、albumId、albumUri和albumName属性使用上的不兼容,无法作为MediaFetchOptions的参数在getFileAssets接口中使用。下面示例代码为错误示例: 32 331. 使用[getMediaLibrary](../../../application-dev/reference/apis/js-apis-medialibrary.md#medialibrarygetmedialibrary)接口获取媒体库实例。 342. 创建检索条件[MediaFetchOptions](../../../application-dev/reference/apis/js-apis-medialibrary.md#mediafetchoptions7)。 353. 调用[getFileAssets](../../../application-dev/reference/apis/js-apis-medialibrary.md#getfileassets7)接口获取文件资源。 36 37**错误示例:** 38 39```js 40import mediaLibrary from '@ohos.multimedia.mediaLibrary'; 41 42async function example() { 43 try { 44 let context = getContext(this); 45 let media = mediaLibrary.getMediaLibrary(context); 46 let fileKeyObj = mediaLibrary.FileKey; 47 let albumId = 1; 48 let getImageOp = { 49 selections: fileKeyObj.ALBUM_ID + '= ?', // 使用parent、albumId、albumUri和albumName属性查询均无法获取文件资源。 50 selectionArgs: [albumId.toString()], 51 }; 52 const fetchFileResult = await media.getFileAssets(getImageOp); // 查询失败,获取的fetchFileResult为空。 53 const fileAsset = await fetchFileResult.getFirstObject(); 54 console.info('mediaLibrary fileAsset displayName: ' + fileAsset.displayName); 55 } catch (err) { 56 console.error('mediaLibrary fail, err: ' + err); 57 } 58} 59``` 60 61推荐使用以下方式调用getFileAssets接口获取文件资源: 62 63**正确示例:** 64 65```js 66import mediaLibrary from '@ohos.multimedia.mediaLibrary'; 67 68async function example() { 69 try { 70 let context = getContext(this); 71 let media = mediaLibrary.getMediaLibrary(context); 72 let fileKeyObj = mediaLibrary.FileKey; 73 let imageType = mediaLibrary.MediaType.IMAGE; 74 let getImageOp = { 75 selections: fileKeyObj.MEDIA_TYPE + '= ?', 76 selectionArgs: [imageType.toString()], // 查询所有图片类型的文件。 77 }; 78 const fetchFileResult = await media.getFileAssets(getImageOp); 79 const fileAsset = await fetchFileResult.getFirstObject(); 80 console.info('mediaLibrary fileAsset displayName: ' + fileAsset.displayName); 81 } catch (err) { 82 console.error('mediaLibrary fail, err: ' + err); 83 } 84} 85``` 86 87**createAsset接口创建相册兼容性影响:** 88 89由于API version 10的SDK上relativePath和相册没有关联关系,文件创建成功后,relativePath的最后一级目录不会作为相册呈现。 90 91**getAlbums接口获取相册兼容性影响:** 92 93由于API version 10的SDK上relativePath和相册没有关联关系,在使用getAlbums时不支持relativePath作为查询条件,并且ALBUM_NAME参数只能使用"Camera"和"Screenshots"。下面示例代码为错误示例: 94 951. 使用[getMediaLibrary](../../../application-dev/reference/apis/js-apis-medialibrary.md#medialibrarygetmedialibrary)接口获取媒体库实例。 962. 创建相册检索条件[MediaFetchOptions](../../../application-dev/reference/apis/js-apis-medialibrary.md#mediafetchoptions7)。 973. 调用[getAlbums](../../../application-dev/reference/apis/js-apis-medialibrary.md#getalbums7)接口获取相册。 98 99**错误示例:** 100 101```js 102import mediaLibrary from '@ohos.multimedia.mediaLibrary'; 103 104async function example() { 105 try { 106 let context = getContext(this); 107 let media = mediaLibrary.getMediaLibrary(context); 108 let AlbumNoArgsfetchOp = { 109 selections: mediaLibrary.FileKey.ALBUM_NAME + ' = ?', 110 selectionArgs: ['新建相册1'], // 获取albumName为新建相册1的相册。 111 }; 112 const albumList = await media.getAlbums(AlbumNoArgsfetchOp); // 查询失败,获取的fetchFileResult为空。 113 for (let i = 0; i < albumList.length; i++) { 114 console.info('mediaLibrary album albumName: ' + albumList[i].albumName); 115 } 116 } catch (err) { 117 console.error('mediaLibrary fail, err: ' + err); 118 } 119} 120``` 121 122使用如下示例代码可以获取Camera和Screenshots相册。 123 124**正确示例:** 125 126```js 127import mediaLibrary from '@ohos.multimedia.mediaLibrary'; 128 129async function example() { 130 try { 131 let context = getContext(this); 132 let media = mediaLibrary.getMediaLibrary(context); 133 let AlbumNoArgsfetchOp = { 134 selections: mediaLibrary.FileKey.ALBUM_NAME + ' = ? OR ' + mediaLibrary.FileKey.ALBUM_NAME + ' = ?', 135 selectionArgs: ['Camera', 'Screenshots'], // 获取相机相册和截屏录屏相册。 136 }; 137 const albumList = await media.getAlbums(AlbumNoArgsfetchOp); 138 for (let i = 0; i < albumList.length; i++) { 139 console.info('mediaLibrary album albumName: ' + albumList[i].albumName); 140 } 141 } catch (err) { 142 console.error('mediaLibrary fail, err: ' + err); 143 } 144} 145``` 146 147**FileAsset.commitModify接口获取相册兼容性影响:** 148 149在API version 10的SDK上去掉了针对audio无意义的orientation属性,在使用commitModify接口时将无法对audio资源的orientation属性进行修改。 150 151**FileAsset.deleteAsset接口删除媒体文件资源兼容性影响:** 152 153修复了文件删除机制的已知问题。该问题会导致系统应用可以通过MediaLibrary.deleteAsset方法将一个没有进入回收站的文件直接彻底删除。 154 155对于系统应用,彻底删除一个文件应该按照以下步骤进行操作: 156 1571. 调用[getFileAssets](../../../application-dev/reference/apis/js-apis-medialibrary.md#getfileassets7)接口获取文件资源。 1582. 然后调用[FileAsset.trash](../../../application-dev/reference/apis/js-apis-medialibrary.md#trash8)接口将文件放入回收站。 1593. 最后调用[MediaLibrary.deleteAsset](../../../application-dev/reference/apis/js-apis-medialibrary.md#deleteasset8)方法将文件彻底删除。 160 161**正确示例:** 162 163```js 164import mediaLibrary from '@ohos.multimedia.mediaLibrary'; 165 166async function example() { 167 try { 168 let context = getContext(this); 169 let media = mediaLibrary.getMediaLibrary(context); 170 let fileKeyObj = mediaLibrary.FileKey; 171 let imageType = mediaLibrary.MediaType.IMAGE; 172 let getImageOp = { 173 selections: fileKeyObj.MEDIA_TYPE + '= ?', 174 selectionArgs: [imageType.toString()], 175 }; 176 const fetchFileResult = await media.getFileAssets(getImageOp); 177 const fileAsset = await fetchFileResult.getFirstObject(); 178 // 将文件删除(放入系统图库的回收站)。 179 await fileAsset.trash(true); 180 // 将文件从系统中彻底删除。 181 await media.deleteAsset(fileAsset.uri); 182 } catch (err) { 183 console.error('Failed to delete asset permanently from system, error: ' + err); 184 } 185} 186``` 187