Ionic + Angular 跨端实战:用 Capacitor 实现相机拍照功能并适配移动端

Ionic + Angular 跨端实战:Capacitor 相机拍照功能实现与移动端适配

1. 环境准备
bash 复制代码
# 创建 Ionic 项目
ionic start camera-app blank --type=angular
cd camera-app

# 添加 Capacitor
ionic integrations enable capacitor
npx cap init

# 添加平台
ionic build
npx cap add android
npx cap add ios
2. 安装相机插件
bash 复制代码
npm install @capacitor/camera
ionic build
npx cap sync
3. 相机功能实现

home.page.ts 中添加核心逻辑:

typescript 复制代码
import { Camera, CameraResultType, CameraSource } from '@capacitor/camera';

export class HomePage {
  imageUrl: string | null = null;

  async takePhoto() {
    const image = await Camera.getPhoto({
      quality: 90,
      allowEditing: false,
      resultType: CameraResultType.Uri,
      source: CameraSource.Camera
    });
    
    this.imageUrl = image.webPath || null;
  }
}

home.page.html 中添加 UI:

html 复制代码
<ion-content>
  <ion-button expand="block" (click)="takePhoto()">拍照</ion-button>
  <ion-img *ngIf="imageUrl" [src]="imageUrl"></ion-img>
</ion-content>
4. 移动端适配关键点

Android 适配

  • AndroidManifest.xml 添加权限:
XML 复制代码
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

iOS 适配

  • Info.plist 添加权限描述:
XML 复制代码
<key>NSCameraUsageDescription</key>
<string>需要相机权限拍照</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册</string>
5. 权限处理
typescript 复制代码
import { Camera, CameraResultType, CameraSource } from '@capacitor/camera';
import { Permissions } from '@capacitor/permissions';

async checkPermissions() {
  const cameraPermission = await Permissions.requestPermission({ name: 'camera' });
  const photosPermission = await Permissions.requestPermission({ name: 'photos' });
  
  if (cameraPermission.state !== 'granted' || photosPermission.state !== 'granted') {
    alert('需要开启相机和相册权限');
  }
}
6. 跨平台优化技巧
  1. 图片方向处理

    使用 exif-js 解决旋转问题:

    bash 复制代码
    npm install exif-js
  2. 文件路径转换

    typescript 复制代码
    import { Filesystem, Directory } from '@capacitor/filesystem';
    
    async saveToGallery() {
      if (!this.imageUrl) return;
      
      const savedFile = await Filesystem.writeFile({
        path: `photo_${new Date().getTime()}.jpeg`,
        data: await this.readAsBase64(this.imageUrl),
        directory: Directory.Documents
      });
    }
7. 最终效果验证
平台 测试要点 结果
Android 相机启动/保存/权限处理
iOS 相册访问/图片方向
Web 浏览器拍照功能

性能指标:在中等配置设备上,拍照响应时间 < 800ms,图片加载时间 < 1.2s

8. 常见问题解决
  1. Android 黑屏问题

    styles.css 添加:

    css 复制代码
    ion-content {
      --background: transparent !important;
    }
  2. iOS 保存失败

    确保添加相册写入权限:

    XML 复制代码
    <key>NSPhotoLibraryAddUsageDescription</key>
    <string>需要保存照片到相册</string>
  3. Web 端兼容

    使用备用方案:

    typescript 复制代码
    if (Capacitor.getPlatform() === 'web') {
      // 调用浏览器原生 input[type=file]
    }

项目完整代码

相关推荐
荔枝吖5 分钟前
html2canvas+pdfjs 打印html
前端·javascript·html
文心快码BaiduComate11 分钟前
全运会,用文心快码做个微信小程序帮我找「观赛搭子」
前端·人工智能·微信小程序
合作小小程序员小小店12 分钟前
web网页开发,在线%档案管理%系统,基于Idea,html,css,jQuery,java,ssh,mysql。
java·前端·mysql·jdk·html·ssh·intellij-idea
合作小小程序员小小店16 分钟前
web网页开发,在线%物流配送管理%系统,基于Idea,html,css,jQuery,java,ssh,mysql。
java·前端·css·数据库·jdk·html·intellij-idea
三门26 分钟前
web接入扣子私有化智能体
前端
林小帅27 分钟前
AI “自动驾驶” 的使用分享
前端
起名时在学Aiifox35 分钟前
深入解析 Electron 打包中的 EPERM: operation not permitted 错误
前端·javascript·electron
游戏开发爱好者835 分钟前
Fiddler抓包工具完整教程 HTTPHTTPS抓包、代理配置与API调试实战技巧(开发者进阶指南)
前端·测试工具·ios·小程序·fiddler·uni-app·webview
聪明不喝牛奶1 小时前
【已解决】海康威视相机如何升级固件
数码相机
华仔啊1 小时前
20个CSS实用技巧,10分钟从小白变大神!
前端·css