CordovaCameraService.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import {
  2. ICameraService,
  3. MediaStreamConstraints,
  4. } from './CameraService';
  5. /**
  6. * Cordova 环境下的摄像头服务实现
  7. * 使用 Cordova Camera 插件
  8. */
  9. export class CordovaCameraService implements ICameraService {
  10. /**
  11. * 请求摄像头权限
  12. * Cordova 插件通常在第一次使用时自动请求权限
  13. * @returns 总是返回 true
  14. */
  15. async requestPermission(): Promise<boolean> {
  16. // Cordova 插件会在实际使用时请求权限
  17. return true;
  18. }
  19. /**
  20. * 获取媒体流
  21. * Cordova 不使用 MediaStream,此方法会抛出错误
  22. * @param constraints 媒体约束条件(未使用)
  23. * @returns 抛出错误
  24. */
  25. async getMediaStream(
  26. constraints?: MediaStreamConstraints
  27. ): Promise<MediaStream> {
  28. throw new Error(
  29. 'Cordova 环境不支持 MediaStream,请直接使用 capturePhoto 方法'
  30. );
  31. }
  32. /**
  33. * 捕获照片
  34. * 使用 Cordova Camera 插件直接拍照
  35. * @param stream 媒体流(在 Cordova 中未使用)
  36. * @returns base64 格式的图片数据
  37. */
  38. async capturePhoto(stream?: MediaStream): Promise<string> {
  39. return new Promise((resolve, reject) => {
  40. // 检查 Cordova Camera 插件是否可用
  41. if (!navigator.camera) {
  42. reject(new Error('Cordova Camera 插件未安装或不可用'));
  43. return;
  44. }
  45. // 检查 Camera 常量是否可用
  46. if (typeof Camera === 'undefined') {
  47. reject(new Error('Camera 常量不可用,请检查 Cordova 插件配置'));
  48. return;
  49. }
  50. // 配置 Camera 选项
  51. const options = {
  52. quality: 80,
  53. destinationType: Camera.DestinationType.DATA_URL,
  54. sourceType: Camera.PictureSourceType.CAMERA,
  55. encodingType: Camera.EncodingType.JPEG,
  56. mediaType: Camera.MediaType.PICTURE,
  57. correctOrientation: true,
  58. targetWidth: 1280,
  59. targetHeight: 720,
  60. saveToPhotoAlbum: false,
  61. };
  62. // 调用 Camera 插件
  63. navigator.camera.getPicture(
  64. (imageData) => {
  65. // 添加 base64 前缀
  66. const base64WithPrefix = `data:image/jpeg;base64,${imageData}`;
  67. resolve(base64WithPrefix);
  68. },
  69. (error) => {
  70. reject(new Error(`拍照失败: ${error}`));
  71. },
  72. options
  73. );
  74. });
  75. }
  76. /**
  77. * 停止媒体流
  78. * Cordova 不需要停止流
  79. * @param stream 媒体流(未使用)
  80. */
  81. stopStream(stream: MediaStream): void {
  82. // Cordova 不需要停止流
  83. // 什么也不做
  84. }
  85. }