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