chenjun

图片下载获取权限

@@ -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 }