在本系列的上一篇文章中, 安装和简单配置了 ionic 的开发环境,并构造了一个 ionic 应用的骨架。本文让读者感受 ionic 访问硬件的能力。这也是 ionic 与纯 Angular 开发主要不同之处。本文的示例参照了官网文档中的实例,但更简单些,并且解决了源实例中有些代码和当前最新环境不兼容的问题。
本文通过构建一个简单的相册功能,来演示如何使用 ionic 和 cordova 来扩展应用使用相机和本地存储(sqlite)的能力。本文参考了 ionic 的官方文档中的一个案例,只是更简化,并且修正了官方案例不能在 ionic 4 中运行的问题。如果想参考官方文档,可以直接访问: Your First Ionic App: Angular
安装 cordova
1 | yarn global add cordova |
系统显示
1 | yarn global v1.16.0 |
引用 cordova.js 文件
修改 src/index.html 文件
1 |
|
增加相机插件
1 | yarn add @ionic-native/camera |
系统显示
1 | yarn add v1.16.0 |
1 | ionic cordova plugin add cordova-plugin-camera |
系统提示
1 | > cordova.cmd plugin add cordova-plugin-camera |
在 config.xml 文件中增加以下内容:
1 | <!-- Required for iOS 10: Camera permission prompt --> |
添加本地存储插件
1 | ionic cordova plugin add cordova-sqlite-storage |
系统显示
1 | > cordova.cmd plugin add cordova-sqlite-storage |
1 | yarn add @ionic/storage |
系统显示
1 | yarn add v1.16.0 |
修改App模块,引入插件
打开 app.module.ts 文件,引入 Camera 和 IonicStorageModule 模块, 修改后的代码如下:
1 | import { NgModule } from '@angular/core'; |
生成服务类 (Service)
1 | ionic g service services/Photo |
系统提示
1 | > ng.cmd generate service services/Photo |
打开 services/photo.service.ts 文件,引入对 Camera 和 Storage。
1 | import { Camera, CameraOptions } from '@ionic-native/camera/ngx'; |
同时修改构造函数,注入 Camera, Storage
1 | constructor(private camera: Camera, private storage: Storage) { } |
在服务类中添加一个新的 Photo 类,用来存在图片数据。定义如下:
1 | class Photo { |
然后在服务类中定义一个 Photo 类的数组,用来存储全部的图片。
1 | public photos: Photo[] = []; |
增加一个 takePicture 方法,在方法中,启动相机精选拍照并将照片放入 photos 数组中,最后存在本地存在中。
1 | takePicture() { |
为了在程序启动时加载已经存在本地的照片,增加一个 loadSaved方法
1 | loadSaved() { |
完整的服务类代码如下:
1 | import { Injectable } from '@angular/core'; |
修改界面组件
打开 src/app/home/home.page.ts 文件, 引入 PhotoService
1 | import { PhotoService } from '../services/photo.service'; |
在构造函数中注入该服务
1 | constructor(public photoService: PhotoService) {} |
增加 ngOnInit 方法,以便在程序启动时执行一些初始化的动作
1 | ngOnInit() { |
在这里,我们通过 ngOnInit 加载已经存在本地的图片。
完整的 home.page.ts 代码如下:
1 | import { Component } from '@angular/core'; |
打开 home.page.html 文件,将原有代码替换为以下代码:
1 | <ion-grid> |
加入Android支持
运行:
1 | ionic cordova prepare android |
运行和测试程序
完成以上修改后,运行以下命令运行程序:
1 | ionic serve --devapp |
系统提示:
1 | ionic serve --devapp |
并自动打开浏览器对应用进行访问。在浏览器中,可以看到开发的界面,但是当你按下拍照的按钮时,得到的是一个错误: “Native: tried calling Camera.getPicture, but Cordova is not available. Make sure to include cordova.js or run in a device/simulator. Camera issue:cordova_not_available”, 说明在应用中用到的本地功能在浏览器中是不可用的。这时我们就需要用到 ionic 的测试工具了: Ionic DevApp。 “Ionic DevApp”是一个手机上运行的 App, 支持 iOS 和 Android 平台,可以到 App Store, Google Play 进行下载。
在手机上安装 Ionic DevApp之后,确保开发用的电脑和手机在同一个局域网中, 打开应用,稍等一会儿, Ionic DevApp 会自动发现在同一个局域网中运行的 App, 选择 App ,就会进入到该 App 的界面。在我们的例子中,这个时候再选择相机,就能打开系统的相机进行拍照,显示,存储了。
下一步
下一篇文章中,我们将练习在真机上运行程序。