Showing
1 changed file
with
80 additions
and
40 deletions
| @@ -5,7 +5,12 @@ import { promptAction } from '@kit.ArkUI'; | @@ -5,7 +5,12 @@ import { promptAction } from '@kit.ArkUI'; | ||
| 5 | import { image } from '@kit.ImageKit'; | 5 | import { image } from '@kit.ImageKit'; |
| 6 | import { photoAccessHelper } from '@kit.MediaLibraryKit'; | 6 | import { photoAccessHelper } from '@kit.MediaLibraryKit'; |
| 7 | import fs from '@ohos.file.fs'; | 7 | import fs from '@ohos.file.fs'; |
| 8 | -import { NetworkUtil } from 'wdKit'; | 8 | +import { DateTimeUtils, NetworkUtil, PermissionUtil } from 'wdKit'; |
| 9 | +import { PrivacySettingModel } from '../model/PrivacySettingModel'; | ||
| 10 | +import { TrackConstants, TrackingButton } from 'wdTracking'; | ||
| 11 | +import { faceDetector } from '@kit.CoreVisionKit'; | ||
| 12 | +import mediaLibrary from '@ohos.multimedia.mediaLibrary'; | ||
| 13 | +import fileIo from '@ohos.file.fs'; | ||
| 9 | 14 | ||
| 10 | const PERMISSIONS: Array<Permissions> = [ | 15 | const PERMISSIONS: Array<Permissions> = [ |
| 11 | 'ohos.permission.READ_IMAGEVIDEO', | 16 | 'ohos.permission.READ_IMAGEVIDEO', |
| @@ -22,6 +27,8 @@ export struct ImageDownloadComponent { | @@ -22,6 +27,8 @@ export struct ImageDownloadComponent { | ||
| 22 | @State photoAccessHelper: photoAccessHelper.PhotoAccessHelper | undefined = undefined; // 相册模块管理实例 | 27 | @State photoAccessHelper: photoAccessHelper.PhotoAccessHelper | undefined = undefined; // 相册模块管理实例 |
| 23 | @State imageBuffer: ArrayBuffer | undefined = undefined; // 图片ArrayBuffer | 28 | @State imageBuffer: ArrayBuffer | undefined = undefined; // 图片ArrayBuffer |
| 24 | @Prop @Watch('onChangeUrl') url: string = '' | 29 | @Prop @Watch('onChangeUrl') url: string = '' |
| 30 | + @State isGranted: boolean = false | ||
| 31 | + @State name: string = '' | ||
| 25 | 32 | ||
| 26 | build() { | 33 | build() { |
| 27 | Column() { | 34 | Column() { |
| @@ -34,14 +41,20 @@ export struct ImageDownloadComponent { | @@ -34,14 +41,20 @@ export struct ImageDownloadComponent { | ||
| 34 | .backgroundColor(Color.Transparent) | 41 | .backgroundColor(Color.Transparent) |
| 35 | .iconColor(Color.White) | 42 | .iconColor(Color.White) |
| 36 | .onClick(async () => { | 43 | .onClick(async () => { |
| 37 | - console.info(`cj2024 onClick ${this.imageBuffer}`) | 44 | + //console.info(`cj2024 onClick ${this.imageBuffer}`) |
| 38 | if (this.imageBuffer !== undefined) { | 45 | if (this.imageBuffer !== undefined) { |
| 39 | - await this.saveImage(this.imageBuffer); | ||
| 40 | - promptAction.showToast({ | ||
| 41 | - message: $r('app.string.image_request_success'), | ||
| 42 | - duration: 2000, | ||
| 43 | - alignment:Alignment.Center | ||
| 44 | - }) | 46 | + try { |
| 47 | + await this.saveImage(this.imageBuffer); | ||
| 48 | + promptAction.showToast({ | ||
| 49 | + message: $r('app.string.image_request_success'), | ||
| 50 | + duration: 2000, | ||
| 51 | + alignment: Alignment.Center | ||
| 52 | + }) | ||
| 53 | + } catch (error) { | ||
| 54 | + const err: BusinessError = error as BusinessError; | ||
| 55 | + //console.info(`Failed to save photo. Code is ${err.code}, message is ${err.message}`); | ||
| 56 | + promptAction.showToast({ message: '保存图片失败!' }); | ||
| 57 | + } | ||
| 45 | } | 58 | } |
| 46 | }) | 59 | }) |
| 47 | } | 60 | } |
| @@ -55,10 +68,11 @@ export struct ImageDownloadComponent { | @@ -55,10 +68,11 @@ export struct ImageDownloadComponent { | ||
| 55 | // 有网络 | 68 | // 有网络 |
| 56 | this.onChangeUrl() | 69 | this.onChangeUrl() |
| 57 | } | 70 | } |
| 71 | + | ||
| 58 | } | 72 | } |
| 59 | 73 | ||
| 60 | async onChangeUrl(): Promise<void> { | 74 | async onChangeUrl(): Promise<void> { |
| 61 | - console.info(`cj2024 图片下载 ${this.url}`) | 75 | + //console.info(`cj2024 图片下载 ${this.url}`) |
| 62 | const context = getContext(this) as common.UIAbilityContext; | 76 | const context = getContext(this) as common.UIAbilityContext; |
| 63 | const atManager = abilityAccessCtrl.createAtManager(); | 77 | const atManager = abilityAccessCtrl.createAtManager(); |
| 64 | await atManager.requestPermissionsFromUser(context, PERMISSIONS); | 78 | await atManager.requestPermissionsFromUser(context, PERMISSIONS); |
| @@ -73,7 +87,7 @@ export struct ImageDownloadComponent { | @@ -73,7 +87,7 @@ export struct ImageDownloadComponent { | ||
| 73 | let httpRequest = http.createHttp(); | 87 | let httpRequest = http.createHttp(); |
| 74 | // 用于订阅HTTP响应头事件 | 88 | // 用于订阅HTTP响应头事件 |
| 75 | httpRequest.on('headersReceive', (header: Object) => { | 89 | httpRequest.on('headersReceive', (header: Object) => { |
| 76 | - console.info('header: ' + JSON.stringify(header)); | 90 | + //console.info('header: ' + JSON.stringify(header)); |
| 77 | }); | 91 | }); |
| 78 | // 用于订阅HTTP流式响应数据接收事件 | 92 | // 用于订阅HTTP流式响应数据接收事件 |
| 79 | let res = new ArrayBuffer(0); | 93 | let res = new ArrayBuffer(0); |
| @@ -83,40 +97,40 @@ export struct ImageDownloadComponent { | @@ -83,40 +97,40 @@ export struct ImageDownloadComponent { | ||
| 83 | resView.set(new Uint8Array(res)); | 97 | resView.set(new Uint8Array(res)); |
| 84 | resView.set(new Uint8Array(data), res.byteLength); | 98 | resView.set(new Uint8Array(data), res.byteLength); |
| 85 | res = newRes; | 99 | res = newRes; |
| 86 | - // console.info('dataReceive res length: ' + res.byteLength); | 100 | + // //console.info('dataReceive res length: ' + res.byteLength); |
| 87 | }); | 101 | }); |
| 88 | // 用于订阅HTTP流式响应数据接收完毕事件 | 102 | // 用于订阅HTTP流式响应数据接收完毕事件 |
| 89 | httpRequest.on('dataEnd', () => { | 103 | httpRequest.on('dataEnd', () => { |
| 90 | this.transcodePixelMap(res); | 104 | this.transcodePixelMap(res); |
| 91 | // 判断网络获取到的资源是否为ArrayBuffer类型 | 105 | // 判断网络获取到的资源是否为ArrayBuffer类型 |
| 92 | - console.info(`dataEnd getPicture ${res}`) | 106 | + //console.info(`dataEnd getPicture ${res}`) |
| 93 | if (res instanceof ArrayBuffer) { | 107 | if (res instanceof ArrayBuffer) { |
| 94 | - console.info(`dataEnd getPicture`) | 108 | + //console.info(`dataEnd getPicture`) |
| 95 | this.imageBuffer = res as ArrayBuffer; | 109 | this.imageBuffer = res as ArrayBuffer; |
| 96 | } | 110 | } |
| 97 | - console.info('No more data in response, data receive end'); | 111 | + //console.info('No more data in response, data receive end'); |
| 98 | }); | 112 | }); |
| 99 | httpRequest.requestInStream(this.url, | 113 | httpRequest.requestInStream(this.url, |
| 100 | - (error: BusinessError, data: number) => { | ||
| 101 | - if (error) { | ||
| 102 | - // 下载失败时弹窗提示检查网络,不执行后续逻辑 | ||
| 103 | - promptAction.showToast({ | ||
| 104 | - message: $r('app.string.image_request_fail'), | ||
| 105 | - duration: 2000 | ||
| 106 | - }) | ||
| 107 | - console.error(`http reqeust failed with. Code: ${error.code}, message: ${error.message}`); | ||
| 108 | - return; | ||
| 109 | - } | ||
| 110 | - // 取消订阅HTTP响应头事件 | ||
| 111 | - httpRequest.off('headersReceive'); | ||
| 112 | - // 取消订阅HTTP流式响应数据接收事件 | ||
| 113 | - httpRequest.off('dataReceive'); | ||
| 114 | - // 取消订阅HTTP流式响应数据接收完毕事件 | ||
| 115 | - httpRequest.off('dataEnd'); | ||
| 116 | - // 当该请求使用完毕时,调用destroy方法主动销毁 | ||
| 117 | - httpRequest.destroy(); | 114 | + (error: BusinessError, data: number) => { |
| 115 | + if (error) { | ||
| 116 | + // 下载失败时弹窗提示检查网络,不执行后续逻辑 | ||
| 117 | + promptAction.showToast({ | ||
| 118 | + message: $r('app.string.image_request_fail'), | ||
| 119 | + duration: 2000 | ||
| 120 | + }) | ||
| 121 | + //console.error(`http reqeust failed with. Code: ${error.code}, message: ${error.message}`); | ||
| 122 | + return; | ||
| 118 | } | 123 | } |
| 119 | - ) | 124 | + // 取消订阅HTTP响应头事件 |
| 125 | + httpRequest.off('headersReceive'); | ||
| 126 | + // 取消订阅HTTP流式响应数据接收事件 | ||
| 127 | + httpRequest.off('dataReceive'); | ||
| 128 | + // 取消订阅HTTP流式响应数据接收完毕事件 | ||
| 129 | + httpRequest.off('dataEnd'); | ||
| 130 | + // 当该请求使用完毕时,调用destroy方法主动销毁 | ||
| 131 | + httpRequest.destroy(); | ||
| 132 | + } | ||
| 133 | + ) | ||
| 120 | } | 134 | } |
| 121 | 135 | ||
| 122 | /** | 136 | /** |
| @@ -147,13 +161,39 @@ export struct ImageDownloadComponent { | @@ -147,13 +161,39 @@ export struct ImageDownloadComponent { | ||
| 147 | * @returns | 161 | * @returns |
| 148 | */ | 162 | */ |
| 149 | async saveImage(buffer: ArrayBuffer | string): Promise<void> { | 163 | async saveImage(buffer: ArrayBuffer | string): Promise<void> { |
| 150 | - console.info(`cj2024 saveImage buffer ${buffer}`) | 164 | + //console.info(`cj2024 saveImage buffer ${buffer}`) |
| 165 | + if (!this.isGranted) { | ||
| 166 | + //跳转权限设置 | ||
| 167 | + // const permissionUtil = new PermissionUtil(); | ||
| 168 | + PermissionUtil.reqPermissionsFromUser(['ohos.permission.READ_MEDIA'], this).then((res) => { | ||
| 169 | + this.isGranted = res; | ||
| 170 | + }); | ||
| 171 | + } else { | ||
| 172 | + // PermissionUtil.openPermissionsInSystemSettings(this); | ||
| 173 | + } | ||
| 174 | + | ||
| 175 | + | ||
| 151 | const context = getContext(this) as common.UIAbilityContext; // 获取getPhotoAccessHelper需要的context | 176 | const context = getContext(this) as common.UIAbilityContext; // 获取getPhotoAccessHelper需要的context |
| 152 | - const helper = photoAccessHelper.getPhotoAccessHelper(context); // 获取相册管理模块的实例 | ||
| 153 | - const uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg'); // 指定待创建的文件类型、后缀和创建选项,创建图片或视频资源 | ||
| 154 | - console.info(`cj2024 saveImage uri ${uri}`) | ||
| 155 | - const file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); | ||
| 156 | - await fs.write(file.fd, buffer); | ||
| 157 | - await fs.close(file.fd); | 177 | + // const helper = photoAccessHelper.getPhotoAccessHelper(context); // 获取相册管理模块的实例 |
| 178 | + // const uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg'); // 指定待创建的文件类型、后缀和创建选项,创建图片或视频资源 | ||
| 179 | + // //console.info(`cj2024 saveImage uri ${uri}`) | ||
| 180 | + // const file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); | ||
| 181 | + // await fs.write(file.fd, buffer); | ||
| 182 | + // await fs.close(file.fd); | ||
| 183 | + let media = mediaLibrary.getMediaLibrary(context); | ||
| 184 | + let publicPath = await media.getPublicDirectory(mediaLibrary.DirectoryType.DIR_IMAGE); | ||
| 185 | + let picName = DateTimeUtils.getCurDate(DateTimeUtils.PATTERN_DATE_TIME_DEFAULT) + '.jpg' | ||
| 186 | + // //console.info(`cj2024 saveImage time ${picName}`) | ||
| 187 | + let asset = await media.createAsset(mediaLibrary.MediaType.IMAGE, picName, publicPath); | ||
| 188 | + | ||
| 189 | + if (asset) { | ||
| 190 | + let fd = await asset.open('rw'); | ||
| 191 | + await fileIo.write(fd, buffer); | ||
| 192 | + await asset.close(fd); | ||
| 193 | + promptAction.showToast({ message: '已保存至相册!' }); | ||
| 194 | + } else { | ||
| 195 | + promptAction.showToast({ message: '保存图片失败!' }); | ||
| 196 | + throw new Error('Failed to create asset'); | ||
| 197 | + } | ||
| 158 | } | 198 | } |
| 159 | } | 199 | } |
-
Please register or login to post a comment