• 【ARK UI】HarmonyOS 从相册选择图片并显示到Image组件上


     参考资料

    【Harmony OS】【ARK UI】ETS 上下文基本操作

    【Harmony OS】【ARK UI】ets使用startAbility或startAbilityForResult方式调起Ability

    Image

    代码运行

    权限申请

    申请文件读取权限,在config.json写如下代码

     "reqPermissions": [
          {
            "name": "ohos.permission.READ_USER_STORAGE"
          },
          {
            "name": "ohos.permission.WRITE_USER_STORAGE"
          }
        ],

    在ets文件动态申请读写权限

     requestMyPermissionsFromUser(){
        var context = featureAbility.getContext();
        context.requestPermissionsFromUser(
          [
            "ohos.permission.READ_USER_STORAGE",
            "ohos.permission.WRITE_USER_STORAGE"
          ],
          1,(err, data)=>{
          console.info("====>requestdata====>" + JSON.stringify(data));
          console.info("====>requesterrcode====>" + JSON.stringify(err.code));
        }
        )
      }
    跳转相册

    在Ets文件写一个跳转按钮跳转到相册,选择相片,返回data的 decodedPath路径就是dataability显示的路径,跳转代码如下

    startAlbumAbility(){
        var str = {
          "want": {
            "deviceId": "",
            "bundleName": "",
            "abilityName": "",
            "uri": "",
            "action": "android.intent.action.GET_CONTENT",//todo 跳转相册的action
            "type":"image/*" //todo 文件类型
          },
        };
        //todo 开始跳转到相册界面
        featureAbility.startAbilityForResult(str, (error, data) => {
          if (error) {
            console.error('Operation failed. Cause: ' + error);
            return;
          }
          if(data.resultCode==-1){//todo 返回到该界面并且得到了结果
             console.info('Operation succeeded: '+JSON.stringify(data) );
            this.IsLocalFlag=false//todo 设置不是本地路径
            this.src="dataability://"+data.want.uri.decodedPath//todo dataability 显示方式
          }else{//todo 返回到该界面没有选择相片
            console.info('Operation fail: ' );
          }
    
        });
      }
    界面显示

    定义一个boolean字段判断是否是本地字段,如果是显示本地图片,如果不是显示从相册中选择的图片,

    Image的dataability的使用 支持dataability://路径前缀的字符串,用于访问通过data ability提供的图片路径。

     Image(this.IsLocalFlag?$r('app.media.icon'):this.src).width(300).height(300)

     

    全部代码

    import featureAbility from '@ohos.ability.featureAbility'
    @Entry
    @Component
    struct Index {
      @State IsLocalFlag:boolean=true;
      @State src: string = ""
      //todo 动态申请文档读写权限
      requestMyPermissionsFromUser(){
        var context = featureAbility.getContext();
        context.requestPermissionsFromUser(
          [
            "ohos.permission.READ_USER_STORAGE",
            "ohos.permission.WRITE_USER_STORAGE"
          ],
          1,(err, data)=>{
          console.info("====>requestdata====>" + JSON.stringify(data));
          console.info("====>requesterrcode====>" + JSON.stringify(err.code));
        }
        )
      }
    
      startAlbumAbility(){
        var str = {
          "want": {
            "deviceId": "",
            "bundleName": "",
            "abilityName": "",
            "uri": "",
            "action": "android.intent.action.GET_CONTENT",//todo 跳转相册的action
            "type":"image/*" //todo 文件类型
          },
        };
        //todo 开始跳转到相册界面
        featureAbility.startAbilityForResult(str, (error, data) => {
          if (error) {
            console.error('Operation failed. Cause: ' + error);
            return;
          }
          if(data.resultCode==-1){//todo 返回到该界面并且得到了结果
             console.info('Operation succeeded: '+JSON.stringify(data) );
            this.IsLocalFlag=false//todo 设置不是本地路径
            this.src="dataability://"+data.want.uri.decodedPath
          }else{//todo 返回到该界面没有选择相片
            console.info('Operation fail: ' );
          }
    
        });
    
      }
    
      build() {
        Row() {
          Column() {
            Text("申请权限")
              .fontSize(50)
              .width(100+"%")
              .height("100")
              .textAlign(TextAlign.Center)
              .fontWeight(FontWeight.Bold)
            .onClick(this.requestMyPermissionsFromUser.bind(this))
            Text("打开相册")
              .fontSize(50)
              .width(100+"%")
              .height("100")
              .textAlign(TextAlign.Center)
              .fontWeight(FontWeight.Bold)
              .onClick(this.startAlbumAbility.bind(this))
            .backgroundColor("#ED6262")
              Image(this.IsLocalFlag?$r('app.media.icon'):this.src).width(300).height(300)
          }
          .width('100%')
        }
        .height('100%')
      }
    }

    运行效果

    e91e68989b7116ae684c7913a2dc700e_1885x1040.gif%40900-0-90-f.gif

    欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh

  • 相关阅读:
    如何进行MDM的产品测试
    SpringBoot项目打包与运行
    vue 手写手动轮播 且图片宽度不一样
    JavaEE-多线程-阻塞队列
    今年考研?七夕顺便把心形线复习一下
    Java从零学起(十二)----HashSet集合
    wordpress redirected you too many times.(多重重定向)
    ifream标签中的子页面,操作父页面的元素
    vscode和HBuilderx设置快捷键注释
    Linux工具git版本控制器介绍
  • 原文地址:https://www.cnblogs.com/developer-huawei/p/16626420.html