Ionic v1相机应用报错:'object'不存在getPicture方法
嘿,我之前在Ionic v1开发相机功能时也碰到过一模一样的问题!给你几个实际可行的排查和解决步骤,应该能帮你搞定:
检查Cordova相机插件是否正确安装
有时候插件安装可能因为网络或者缓存问题失败,先运行命令查看已安装的插件:cordova plugin list如果看不到
cordova-plugin-camera,就重新安装适配Ionic v1的版本(不要装最新版,容易出现兼容问题):cordova plugin add cordova-plugin-camera@2.4.1确认ngCordova与cordova.js的引入顺序
这是最容易踩的坑!在index.html里,必须保证引入顺序是:angular.js→ng-cordova.min.js→cordova.js,示例如下:<!-- Angular核心库 --> <script src="lib/angular/angular.min.js"></script> <!-- ngCordova必须在cordova.js之前引入 --> <script src="lib/ngCordova/dist/ng-cordova.min.js"></script> <!-- Cordova原生API核心 --> <script src="cordova.js"></script>顺序错了的话,ngCordova无法正确绑定Cordova的原生API,就会导致
$cordovaCamera变成空对象,自然找不到getPicture方法。确保在设备就绪后调用相机API
Cordova的所有原生API都必须在deviceready事件触发后才能调用,Ionic v1里可以用$ionicPlatform.ready()包裹你的相机逻辑,修改后的代码如下:$scope.takePhoto = function () { // 等待设备就绪后再执行相机操作 $ionicPlatform.ready(function() { var options = { quality: 100, destinationType: Camera.DestinationType.DATA_URL, sourceType: Camera.PictureSourceType.CAMERA, allowEdit: true, encodingType: Camera.EncodingType.JPEG, targetWidth: 300, targetHeight: 300, saveToPhotoAlbum: true }; $cordovaCamera.getPicture(options).then(function (imageData) { $rootScope.imgURI = "data:image/jpeg;base64," + imageData; $state.go('menu.signUp'); }, function (err) { console.error('相机调用失败:', err); // 这里可以给用户显示错误提示,比如用$ionicPopup // $ionicPopup.alert({title: '错误', template: '无法打开相机,请重试'}); }); }); }另外注意:你的代码里
popoverOptions: CameraPopoverOptions可能有问题,这个参数需要是具体的配置对象,而不是直接写常量,如果你不需要popover配置可以直接删掉这一行,避免额外的错误。尝试用数字常量替代Camera枚举
如果Camera全局对象未正确加载,直接用枚举值会导致错误,你可以用对应的数字代替:var options = { quality: 100, destinationType: 0, // 对应Camera.DestinationType.DATA_URL sourceType: 1, // 对应Camera.PictureSourceType.CAMERA allowEdit: true, encodingType: 0, // 对应Camera.EncodingType.JPEG targetWidth: 300, targetHeight: 300, saveToPhotoAlbum: true };清理平台缓存并重新构建
有时候平台缓存会导致插件未正确集成,试试移除再重新添加平台(以Android为例):cordova platform remove android cordova platform add android ionic build android
你可以按顺序尝试这些方法,我当时就是因为ngCordova的引入顺序错了导致的问题,调整后就正常了!
内容的提问来源于stack exchange,提问作者Najam Us Saqib

