今天有個壇友問跳轉到文件和圖庫如何將選擇的圖片讀取出來在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
