鴻蒙跳轉到圖庫或者文件選擇圖片並顯示到Image控件中


今天有個壇友問跳轉到文件和圖庫如何將選擇的圖片讀取出來在Image控件中顯示,我這里分享一下解決思路。

首先當然是建個布局頁面,頁面上放個按鈕和圖片控件,如下代碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<? 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權限,代碼如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM