明天有个坛友问跳转到文件和图库如何将抉择的图片读取进去在Image控件中显示,我这里分享一下解决思路。

首先当然是建个布局页面,页面上放个按钮和图片控件,如下代码

<?xml version="1.0" encoding="utf-8"?><DirectionalLayout    xmlns:ohos="http://schemas.huawei.com/res/ohos"    ohos:height="match_parent"    ohos:width="match_parent"    ohos:orientation="vertical">    <Button        ohos:id="$+id:btnChooseImg"        ohos:height="match_content"        ohos:width="match_content"        ohos:text="抉择图片"        ohos:text_size="40vp"        ohos:background_element="gray"></Button>    <Image        ohos:id="$+id:showChooseImg"        ohos:height="match_content"        ohos:width="match_content"        ></Image></DirectionalLayout>

而后看一下后盾代码,后辈次要用到DataAbility去拜访图片,拜访图片咱们须要申请ohos.permission.READ_USER_STORAGE权限,代码如下

package com.example.phonetest.slice;import com.example.phonetest.ResourceTable;import ohos.aafwk.ability.AbilitySlice;import ohos.aafwk.ability.DataAbilityHelper;import ohos.aafwk.content.Intent;import ohos.aafwk.content.Operation;import ohos.agp.components.Button;import ohos.agp.components.Image;import ohos.hiviewdfx.HiLog;import ohos.hiviewdfx.HiLogLabel;import ohos.media.image.ImageSource;import ohos.media.image.PixelMap;import ohos.media.photokit.metadata.AVStorage;import ohos.utils.net.Uri;import java.io.File;import java.io.FileDescriptor;public class ChooseImageTestSlice extends AbilitySlice {    static final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x0001, "抉择图片测试");    private final int imgRequestCode=1123;    Image showChooseImg=null;    @Override    public void onStart(Intent intent) {        super.onStart(intent);        super.setUIContent(ResourceTable.Layout_ability_choose_image_test);        //获取存储权限        requestPermissionsFromUser(new String[]{"ohos.permission.READ_USER_STORAGE"},imgRequestCode);        Button btnChooseImg=(Button)findComponentById(ResourceTable.Id_btnChooseImg);        btnChooseImg.setClickedListener(c->{            //抉择图片            selectPic();        });        showChooseImg=(Image)findComponentById(ResourceTable.Id_showChooseImg);    }    private void selectPic() {        Intent intent = new Intent();        Operation opt=new Intent.OperationBuilder().withAction("android.intent.action.GET_CONTENT").build();        intent.setOperation(opt);        intent.addFlags(Intent.FLAG_NOT_OHOS_COMPONENT);        intent.setType("image/*");        startAbilityForResult(intent, imgRequestCode);    }    @Override    protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) {        if(requestCode==imgRequestCode)        {            HiLog.info(label,"抉择图片getUriString:"+resultData.getUriString());            //抉择的Img对应的Uri            String chooseImgUri=resultData.getUriString();            HiLog.info(label,"抉择图片getScheme:"+chooseImgUri.substring(chooseImgUri.lastIndexOf('/')));            //定义数据能力帮忙对象            DataAbilityHelper helper=DataAbilityHelper.creator(getContext());            //定义图片起源对象            ImageSource imageSource = null;            //获取抉择的Img对应的Id            String chooseImgId=null;            //如果是抉择文件则getUriString后果为content://com.android.providers.media.documents/document/image%3A30,其中%3A是":"的URL编码后果,前面的数字就是image对应的Id            //如果抉择的是图库则getUriString后果为content://media/external/images/media/30,最初就是image对应的Id            //这里须要判断是抉择了文件还是图库            if(chooseImgUri.lastIndexOf("%3A")!=-1){                chooseImgId = chooseImgUri.substring(chooseImgUri.lastIndexOf("%3A")+3);            }            else {                chooseImgId = chooseImgUri.substring(chooseImgUri.lastIndexOf('/')+1);            }            //获取图片对应的uri,因为获取到的前缀是content,咱们替换成对应的dataability前缀            Uri uri=Uri.appendEncodedPathToUri(AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI,chooseImgId);            HiLog.info(label,"抉择图片dataability门路:"+uri.toString());            try {                //读取图片                FileDescriptor fd = helper.openFile(uri, "r");                imageSource = ImageSource.create(fd, null);                //创立位图                PixelMap pixelMap = imageSource.createPixelmap(null);                //设置图片控件对应的位图                showChooseImg.setPixelMap(pixelMap);            } catch (Exception e) {                e.printStackTrace();            } finally {                if (imageSource != null) {                    imageSource.release();                }            }        }    }    @Override    public void onActive() {        super.onActive();    }    @Override    public void onForeground(Intent intent) {        super.onForeground(intent);    }}

这里要留神下在弹出的抉择有让咱们抉择图库还是文件,这两种形式解决形式不一样,判断一下就能够了,代码中曾经正文。

我看一下运行后果



记得提前拍两张照片,因为模拟器外面一开始是没有照片的

原文链接:https://developer.huawei.com/...
原作者:Kak_zhou