明天有个坛友问跳转到文件和图库如何将抉择的图片读取进去在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