【问题标题】:Ionic/Cordova: How to integrate Cordova Plugins into existing Ionic project?Ionic/Cordova:如何将 Cordova 插件集成到现有的 Ionic 项目中?
【发布时间】:2014-05-15 08:38:43
【问题描述】:

我有一个 Ionic 项目,我需要 Cordova 相机插件(我现在已成功安装)。但在我的项目中,Camera API 仍然不可用,即出现错误:

ReferenceError: Camera is not defined
at Scope.$scope.takePic 

如何激活要在 Ionic 项目中使用的插件 API?关于这方面的文档似乎相当不存在或隐藏得很好。

【问题讨论】:

    标签: cordova plugins camera ionic-framework


    【解决方案1】:

    按照以下步骤操作:

    1.在cordova.js之前包含ngCordova

    你可以找到相同的描述in the docs

    <script src="lib/ngCordova/dist/ng-cordova.js"></script>
    <script src="cordova.js"></script>
    

    2。在命令行中添加你的插件

    您可以在文档in the section of your specific plugin 中找到此步骤。

    ionic plugin add org.apache.cordova.camera
    

    3.请记住,在浏览器中工作时,cordova 不可用

    因此,当使用$cordovaCamera.getPicture 时,库在内部调用navigator.camera.getPicture,这在桌面浏览器中开发时不可用。 Further reading

    ngCordova / Ionic 团队目前是working on mocks,您可以使用它来避免此类问题。


    您可以在此处下载 ngCordova:http://ngcordova.com/docs/install/


    更新:现在有 Ionic Native,它类似于 ngCordova,但适用于 ES6 和 TypeScript。

    【讨论】:

    • 我正在关注 ngCordova 的文档并在真实设备上进行测试。我犯了同样的错误。我很确定 $cordovaCamera 注入正确,因为我可以在控制台中打印出 $cordovaCamera,但我遇到的问题是 Camera 未定义,因此您不能在相机选项中使用诸如 Camera.DestinationType.DATA_URL 之类的便利常量。跨度>
    • 我这里有同样的错误。你解决了这个问题吗?
    • 我现在有这个错误$cordovaCamera.getPicture is not a function。您的解决方案不起作用。问题是:我的相机功能以前工作过,我已经评论/删除了我在相机功能之后编写的所有代码,但它仍然坏了。在模拟器上测试,链接到 Android 的 chrome 和离子实验室
    • 我在相机方面有很多工作要做。我们无法解决问题。我的建议是创建新项目并首先添加相机插件,然后添加其他插件
    • ng-Cordova 必须在这里下载ngcordova.com/docs/install
    【解决方案2】:

    在应用的根目录中打开一个终端并通过添加插件

    cordova plugin add org.apache.cordova.camera
    

    编辑
    新命令是:

    cordova plugin rm cordova-plugin-camera //remove
    cordova plugin add cordova-plugin-camera //add
    

    【讨论】:

    • 这对我不起作用。我仍然收到Camera is not defined 错误。
    【解决方案3】:

    我自己正在尝试弄清楚如何将标准 Cordova 插件与 Ionic 一起使用,但 ionic 团队最近构建了 ngCordova——一个用于常见 Cordova API 的角度包装器,其中包括您要使用的 Camera api。建议使用它:请参阅their docs 了解更多信息。

    【讨论】:

      【解决方案4】:

      进入项目目录。

      运行这个命令:

      $ ionic 集成启用 cordova --quiet

      (希望这对其他人有所帮助。)

      【讨论】:

      • 此命令用于将 cordova 添加到现有的 ionic 项目中。换句话说,将 cordova 集成到现有的 ionic 项目中。
      【解决方案5】:

      这是在浏览器上进行测试时的常见问题: http://ngcordova.com/docs/common-issues/

      【讨论】:

        【解决方案6】:

        您需要将Camera 注入控制器,如下所示:

        .controller('MyCtrl', function($scope, Camera) {
        

        请注意,Camera 之前没有美元符号。这确实应该更明确地记录下来。

        另外,您需要在 services.js 中添加工厂:

        .factory('Camera', ['$q', function($q) {
        
          return {
            getPicture: function(options) {
              var q = $q.defer();
        
              navigator.camera.getPicture(function(result) {
                // Do any magic you need
                q.resolve(result);
              }, function(err) {
                q.reject(err);
              }, options);
        
              return q.promise;
            }
          }
        }])
        

        【讨论】:

        • 你真的需要工厂吗?你能不能只将它添加到使用它的视图的控制器中?
        • 也许不是,但我记得尝试了很多不同的东西,最后偶然发现了工厂,这是对我有用的第一件事。所以,你可能不需要工厂,但我知道它可以用它。
        • 我在尝试为 ios 构建时得到“导航器未定义”
        • @Lotus 我没有 Mac,所以我还没有尝试为 iOS 构建它。但我确实知道这段代码在我的 iPhone 上可以与 Ionic Viewer 一起使用。
        【解决方案7】:

        你可以通过运行安装插件:

        $ cordova plugin add org.apache.cordova.camera
        

        现在您已经安装了插件,您可以在 Javascript 中使用相机 API:

        function takePicture() {
          navigator.camera.getPicture(function(imageURI) {
        
            // imageURI is the URL of the image that we can use for
            // an <img> element or backgroundImage.
        
          }, function(err) {
        
            // Ruh-roh, something bad happened
        
          }, cameraOptions);
        }
        

        这将提示用户拍照,并返回图片的本地 URL,然后您可以在标签内使用该 URL 或用于 CSS 背景图片。

        您可以使用下面的代码对相机插件进行简单的包装,以便轻松地异步抓取照片:

        module.factory('Camera', ['$q', function($q) {
        
          return {
            getPicture: function(options) {
              var q = $q.defer();
        
              navigator.camera.getPicture(function(result) {
                // Do any magic you need
                q.resolve(result);
              }, function(err) {
                q.reject(err);
              }, options);
        
              return q.promise;
            }   } }]);
        

        这个工厂可以像这样在你的控制器中使用:

        .controller('MyCtrl', function($scope, Camera) {
        
          $scope.getPhoto = function() {
            Camera.getPicture().then(function(imageURI) {
              console.log(imageURI);
            }, function(err) {
              console.err(err);
            });
          };
        

        调用 getPhoto() 时会打开相机(例如,通过单击按钮)。

        根据您如何从相机请求数据并在 Angular 标记中使用它,您可能必须将图像 URL 列入白名单,以便 Angular 允许使用 file:// URL(例如,如果您使用 ng-src标签):

        module.config(function($compileProvider){
          $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|tel):/);
        })
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-11
          • 2020-08-29
          • 2018-05-10
          • 2018-08-12
          • 2020-08-29
          • 2017-12-18
          • 1970-01-01
          相关资源
          最近更新 更多