寶雞做網(wǎng)站公司谷歌瀏覽器下載官網(wǎng)
【HarmonyOS】 鴻蒙保存圖片或視頻到相冊
前言
鴻蒙中保存圖片或者視頻,或者其他媒體文件到設(shè)備的媒體庫,可以是相冊,也可以是文件管理等。共有兩種方式:
- 需要應(yīng)用申請受限權(quán)限,獲取文件讀寫的權(quán)限(調(diào)用需要ohos.permission.READ_IMAGEVIDEO和ohos.permission.WRITE_IMAGEVIDEO的權(quán)限),這樣就可以將媒體資源(圖片or視頻or等等)保存到媒體庫。
- 通過安全控件,用戶觸發(fā)后表示同意,可以臨時授權(quán)給應(yīng)用就行保存處理。
關(guān)于第二種安全控件,又分為saveButton保存按鈕和showAssetsCreationDialog授權(quán)彈框兩種形式。前者的按鈕樣式不能自定義,所以后者以彈框的形式,讓用戶操作,觸發(fā)入口的樣式,應(yīng)用就可以自定義了。后者算是前者的一種替代補(bǔ)充。
一、保存圖片和視頻授權(quán)示例
需要申請"ohos.permission.READ_IMAGEVIDEO"和"ohos.permission.WRITE_IMAGEVIDEO"權(quán)限。該權(quán)限是管制權(quán)限,需要你的應(yīng)用去通過場景申請【申請使用受限權(quán)限】
配置權(quán)限READ_IMAGEVIDEO,WRITE_IMAGEVIDEO
"requestPermissions": [{"name": "ohos.permission.READ_IMAGEVIDEO","usedScene": {"abilities": ["EntryAbility"],"when": "inuse"},"reason": "$string:CAMERA"},{"name": "ohos.permission.WRITE_IMAGEVIDEO","usedScene": {"abilities": ["EntryAbility"],"when": "inuse"},"reason": "$string:CAMERA"}
]
向用戶申請權(quán)限
// 創(chuàng)建申請權(quán)限明細(xì)async reqPermissionsFromUser(): Promise<number[]> {let context = getContext() as common.UIAbilityContext;let atManager = abilityAccessCtrl.createAtManager();let grantStatus = await atManager.requestPermissionsFromUser(context, ['ohos.permission.READ_IMAGEVIDEO','ohos.permission.WRITE_IMAGEVIDEO']);return grantStatus.authResults;}// 用戶申請權(quán)限async requestPermission() {let grantStatus = await this.reqPermissionsFromUser();for (let i = 0; i < grantStatus.length; i++) {if (grantStatus[i] === 0) {// 用戶授權(quán),可以繼續(xù)訪問目標(biāo)操作}}}
保存圖片到媒體庫
public async savePicture(buffer: ArrayBuffer): Promise<void> {let helper : photoAccessHelper.PhotoAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext(this) as common.UIAbilityContext);let options: photoAccessHelper.CreateOptions = {title: Date.now().toString()};let photoUri: string = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg', options);console.info(photoUri)// createAsset的調(diào)用需要ohos.permission.READ_IMAGEVIDEO和ohos.permission.WRITE_IMAGEVIDEO的權(quán)限let file: fs.File = fs.openSync(photoUri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);await fs.write(file.fd, buffer);fs.closeSync(file);
}
二、saveButton示例
import { photoAccessHelper } from '@kit.MediaLibraryKit';
struct saveButtonExample {saveButtonOptions: SaveButtonOptions = {icon: SaveIconStyle.FULL_FILLED,text: SaveDescription.SAVE_IMAGE,buttonType: ButtonType.Capsule} // 設(shè)置安全控件按鈕屬性build() {Row() {Column() {SaveButton(this.saveButtonOptions) // 創(chuàng)建安全控件按鈕.onClick(async (event, result: SaveButtonOnClickResult) => {if (result == SaveButtonOnClickResult.SUCCESS) {try {let context = getContext();let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);// 需要確保fileUri對應(yīng)的資源存在let fileUri = 'file://com.example.temptest/data/storage/el2/base/haps/entry/files/test.jpg';let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest(context, fileUri);await phAccessHelper.applyChanges(assetChangeRequest);console.info('createAsset successfully, uri: ' + assetChangeRequest.getAsset().uri);} catch (err) {console.error(`create asset failed with error: ${err.code}, ${err.message}`);}} else {console.error('SaveButtonOnClickResult create asset failed');}})}.width('100%')}.height('100%')}
}
三、 showAssetsCreationDialog示例
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { fileIo } from '@kit.CoreFileKit';let context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);async function showAssetsCreationDialogExample() {try {// 指定待保存到媒體庫的位于應(yīng)用沙箱的圖片urilet srcFileUri = 'file://com.example.temptest/data/storage/el2/base/haps/entry/files/test.jpg';let srcFileUris: Array<string> = [srcFileUri];// 指定待保存照片的創(chuàng)建選項,包括文件后綴和照片類型,標(biāo)題和照片子類型可選let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [{title: 'test', // 可選fileNameExtension: 'jpg',photoType: photoAccessHelper.PhotoType.IMAGE,subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可選}];// 基于彈窗授權(quán)的方式獲取媒體庫的目標(biāo)urilet desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);// 將來源于應(yīng)用沙箱的照片內(nèi)容寫入媒體庫的目標(biāo)urilet desFile: fileIo.File = await fileIo.open(desFileUris[0], fileIo.OpenMode.WRITE_ONLY);let srcFile: fileIo.File = await fileIo.open(srcFileUri, fileIo.OpenMode.READ_ONLY);await fileIo.copyFile(srcFile.fd, desFile.fd);fileIo.closeSync(srcFile);fileIo.closeSync(desFile);console.info('create asset by dialog successfully');} catch (err) {console.error(`failed to create asset by dialog successfully errCode is: ${err.code}, ${err.message}`);}
}
注意:
1. 使用createAsset需要指定是視頻還是圖片, fileio.open并不校驗文件內(nèi)容
2. 使用createImageAssetRequest接口,如果要保存視頻需要用createVideoeAssetRequest
或者還可以直接使用createAssetRequest和addResource的方式