跳至主要內容
版本:v8

使用相機拍照

現在是好玩的部分 - 使用 Capacitor Camera API 新增使用裝置相機拍照的功能。 我們將從為網頁建置開始,然後進行一些小調整以使其在行動裝置(iOS 和 Android)上運作。

相片服務

所有 Capacitor 邏輯(相機使用和其他原生功能)將封裝在服務類別中。 使用 ionic generate 命令建立 PhotoService

ionic g service services/photo

開啟新的 services/photo.service.ts 檔案,並新增將支援相機功能的邏輯。 首先,匯入 Capacitor 相依性並取得 Camera、Filesystem 和 Storage 外掛程式的參考

import { Camera, CameraResultType, CameraSource, Photo } from '@capacitor/camera';
import { Filesystem, Directory } from '@capacitor/filesystem';
import { Preferences } from '@capacitor/preferences';

接下來,定義一個新的類別方法 addNewToGallery,其中將包含核心邏輯以拍攝裝置照片並將其儲存到檔案系統。 我們從開啟裝置相機開始

public async addNewToGallery() {
// Take a photo
const capturedPhoto = await Camera.getPhoto({
resultType: CameraResultType.Uri,
source: CameraSource.Camera,
quality: 100
});
}

請注意這裡的魔法:沒有平台特定的程式碼(網頁、iOS 或 Android)!Capacitor Camera 外掛程式為我們抽象化了這一點,只留下一個方法呼叫 - Camera.getPhoto() - 它將開啟裝置的相機並允許我們拍照。

接下來,開啟 tab2.page.ts 並匯入 PhotoService 類別,然後新增一個方法,該方法會呼叫匯入服務上的 addNewToGallery 方法

import { PhotoService } from '../services/photo.service';

constructor(public photoService: PhotoService) { }

addPhotoToGallery() {
this.photoService.addNewToGallery();
}

然後,開啟 tab2.page.html 並在點擊/按下 FAB 時呼叫 addPhotoToGallery() 函式

<ion-content>
<ion-fab vertical="bottom" horizontal="center" slot="fixed">
<ion-fab-button (click)="addPhotoToGallery()">
<ion-icon name="camera"></ion-icon>
</ion-fab-button>
</ion-fab>
</ion-content>

儲存檔案,如果尚未執行,請執行 ionic serve 來重新啟動瀏覽器中的開發伺服器。 在「相片庫」索引標籤上,按一下「相機」按鈕。 如果您的電腦有任何類型的網路攝影機,就會出現一個模式視窗。 來張自拍吧!

A photo gallery app displaying a webcam selfie.

(您的自拍可能比我的好得多)

拍照後,它會立即消失。 我們需要將其顯示在我們的應用程式中並儲存起來以供日後存取。

顯示相片

PhotoService 類別定義之外(檔案的最底部),建立一個新的介面 UserPhoto 來保存我們的相片中繼資料

export interface UserPhoto {
filepath: string;
webviewPath?: string;
}

回到檔案的頂部,定義一個相片陣列,其中將包含使用相機拍攝的每張相片的參考。

export class PhotoService {
public photos: UserPhoto[] = [];

// other code
}

addNewToGallery 函式中,將新拍攝的相片新增至相片陣列的開頭。

  const capturedPhoto = await Camera.getPhoto({
resultType: CameraResultType.Uri,
source: CameraSource.Camera,
quality: 100
});

this.photos.unshift({
filepath: "soon...",
webviewPath: capturedPhoto.webPath!
});
}

接下來,移至 tab2.page.html,以便我們可以在螢幕上顯示影像。 新增一個 Grid 元件,以便每張相片在相片新增到圖庫時都能正常顯示,並迴圈遍歷 PhotoServices 的相片陣列中的每張相片,為每張相片新增一個影像元件(<ion-img>)。 將 src(來源)指向相片的路徑

<ion-content>
<ion-grid>
<ion-row>
<ion-col size="6" *ngFor="let photo of photoService.photos; index as position">
<ion-img [src]="photo.webviewPath"></ion-img>
</ion-col>
</ion-row>
</ion-grid>

<!-- ion-fab markup -->
</ion-content>

儲存所有檔案。 在網頁瀏覽器中,按一下「相機」按鈕並再拍一張相片。 這次,相片會顯示在相片庫中!

接下來,我們將新增對將相片儲存到檔案系統的支援,以便稍後可以擷取並顯示在我們的應用程式中。