从文件系统加载照片
我们已经实现了拍照和保存到文件系统的功能。还缺少最后一项功能:照片存储在文件系统中,但我们需要一种方式来保存每个文件的指针,以便它们可以再次在照片库中显示。
幸运的是,这很容易:我们将利用 Capacitor Preferences API 将照片数组存储在键值存储中。
Preferences API
打开 photo.service.ts,首先在 PhotoService 类中定义一个将作为存储键的新属性。
export class PhotoService {
public photos: UserPhoto[] = [];
// CHANGE: Add a key for photo storage
private PHOTO_STORAGE: string = 'photos';
// ...existing code...
}
接下来,在 addNewToGallery() 方法的末尾,添加一个对 Preferences.set() 的调用以保存 photos 数组。通过将其添加在这里,每次拍摄新照片时都会存储 photos 数组。这样,无论应用用户何时关闭或切换到其他应用,所有照片数据都会被保存。
import { Injectable } from '@angular/core';
import { Camera, CameraResultType, CameraSource } from '@capacitor/camera';
import type { Photo } from '@capacitor/camera';
import { Filesystem, Directory } from '@capacitor/filesystem';
// CHANGE: Add import
import { Preferences } from '@capacitor/preferences';
@Injectable({
providedIn: 'root',
})
export class PhotoService {
// ...existing code...
// CHANGE: Update `addNewToGallery()` method
public async addNewToGallery() {
// Take a photo
const capturedPhoto = await Camera.getPhoto({
resultType: CameraResultType.Uri,
source: CameraSource.Camera,
quality: 100,
});
const savedImageFile = await this.savePicture(capturedPhoto);
this.photos.unshift(savedImageFile);
// CHANGE: Add method to cache all photo data for future retrieval
Preferences.set({
key: this.PHOTO_STORAGE,
value: JSON.stringify(this.photos),
});
}
// ...existing code...
}
export interface UserPhoto {
filepath: string;
webviewPath?: string;
}
照片数组数据已保存,接下来在 PhotoService 类中创建一个名为 loadSaved() 的新公共方法,用于检索照片数据。我们使用相同的键以 JSON 格式检索 photos 数组,然后将其解析为数组:
export class PhotoService {
// ...existing code...
// CHANGE: Add the method to load the photo data
public async loadSaved() {
// Retrieve cached photo array data
const { value: photoList } = await Preferences.get({ key: this.PHOTO_STORAGE });
this.photos = (photoList ? JSON.parse(photoList) : []) as UserPhoto[];
}
}