Capturing and storing a picture taken with the Camera into a local database / PhoneGap / Cordova / iOS

前端 未结 5 991
走了就别回头了
走了就别回头了 2020-11-27 03:45

I\'m currently building an app for iOS using Phonegap/Cordova and jQuerymobile. The idea is to take photos with camera and store the captured image for future use. I would l

相关标签:
5条回答
  • 2020-11-27 04:18

    I just did a that works with promises, based on Jérôme's answer above:

    function moveFile(file){
    
        var deferred = $q.defer();
    
        window.resolveLocalFileSystemURL(file,
            function resolveOnSuccess(entry){
    
                var dateTime = moment.utc(new Date).format('YYYYMMDD_HHmmss');
                var newFileName = dateTime + ".jpg";
                var newDirectory = "photos";
    
                window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSys) {
    
                        //The folder is created if doesn't exist
                        fileSys.root.getDirectory( newDirectory,
                            {create:true, exclusive: false},
                            function(directory) {
    
                                entry.moveTo(directory, newFileName, function (entry) {
                                    //Now we can use "entry.toURL()" for the img src
                                    console.log(entry.toURL());
                                    deferred.resolve(entry);
    
                                }, resOnError);
                            },
                            resOnError);
                    },
                    resOnError);
            }, resOnError);
    
        return deferred.promise;
    }
    
    function resOnError(error) {
        console.log('Awwww shnap!: ' + error.code);
    }
    
    0 讨论(0)
  • 2020-11-27 04:18

    There are 3 steps:

    1. Get the photo. Apple has a good example for this on the iPhone dev site
    2. Get your Documents directory, like so:
      
      NSArray *arrayPaths = NSSearchPathForDirectoriesInDomains(
                  NSDocumentDirectory,
                  NSUserDomainMask,
                  YES);
      NSString *docDir = [arrayPaths objectAtIndex:0];
      
    3. And finally, storing the UIImage you got in step 1 out to disk:
      
      NSString *filename = @"mypic.png";
      NSString *fullpath = [docDir stringByAppendingPathComponent:filename];
      [UIImagePNGRepresentation(image) writeToFile:fullpath atomically:YES];
      
    0 讨论(0)
  • 2020-11-27 04:20
    if (index == '0')
    {
        var options = {
            quality: 50,
            destinationType: Camera.DestinationType.FILE_URI,
            sourceType: Camera.PictureSourceType.CAMERA,
            allowEdit: false,
            encodingType: Camera.EncodingType.JPEG,
            popoverOptions: CameraPopoverOptions,
            saveToPhotoAlbum: false,
            correctOrientation:true
        };
    
        $cordovaCamera.getPicture(options).then(movePic,function(imageData) {
            $rootScope.imageUpload=imageData;
        }, function(err) {
            console.error(err);
        });
    
        function movePic(imageData){
            console.log("move pic");
            console.log(imageData);
            window.resolveLocalFileSystemURL(imageData, resolveOnSuccess, resOnError);
        }
    
        function resolveOnSuccess(entry){
            console.log("resolvetosuccess");
    
            //new file name
            var newFileName = itemID + ".jpg";
            var myFolderApp = "ImgFolder";
    
            window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSys) {
                console.log("folder create");
    
                //The folder is created if doesn't exist
                fileSys.root.getDirectory( myFolderApp,
                    {create:true, exclusive: false},
                    function(directory) {
                        console.log("move to file..");
                        entry.moveTo(directory, newFileName,  successMove, resOnError);
                        console.log("release");
    
                    },
                    resOnError);
            },
            resOnError);
        }
    
        function successMove(entry) {
            //I do my insert with "entry.fullPath" as for the path
            console.log("success");
            //this is file path, customize your path
            console.log(entry);
        }
    
        function resOnError(error) {
            console.log("failed");
        }
    
    }
    
    0 讨论(0)
  • 2020-11-27 04:30

    Ok, here is the solution.

    • in the Html file

    • I have an image tag for displaying the picture taken by the camera :

    • I have a button that runs a function for taking photo : Capture Photo

    • The function to capture photo is (when the photo is taken, the scr of the 'smallImage' id is populated with the path of the photo)

      function capturePhoto() {
      // Take picture using device camera and retrieve image as base64-encoded string
          navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 50 });
      }
      
      //Callback function when the picture has been successfully taken
      function onPhotoDataSuccess(imageData) {                
          // Get image handle
          var smallImage = document.getElementById('smallImage');
      
          // Unhide image elements
          smallImage.style.display = 'block';
          smallImage.src = imageData;
      }
      
      //Callback function when the picture has not been successfully taken
      function onFail(message) {
          alert('Failed to load picture because: ' + message);
      }
      
    • Now I want to move the picture in a permanent folder and then save the link into my database :

      function movePic(file){ 
          window.resolveLocalFileSystemURI(file, resolveOnSuccess, resOnError); 
      } 
      
      //Callback function when the file system uri has been resolved
      function resolveOnSuccess(entry){ 
          var d = new Date();
          var n = d.getTime();
          //new file name
          var newFileName = n + ".jpg";
          var myFolderApp = "EasyPacking";
      
          window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSys) {      
          //The folder is created if doesn't exist
          fileSys.root.getDirectory( myFolderApp,
                          {create:true, exclusive: false},
                          function(directory) {
                              entry.moveTo(directory, newFileName,  successMove, resOnError);
                          },
                          resOnError);
                          },
          resOnError);
      }
      
      //Callback function when the file has been moved successfully - inserting the complete path
      function successMove(entry) {
          //I do my insert with "entry.fullPath" as for the path
      }
      
      function resOnError(error) {
          alert(error.code);
      }
      
    • My file has been saved in the database to display it, i put "file://" front of the row that contains the image src

    Hope this help. J.

    P.S. : - many thanks to Simon Mac Donald (http://hi.im/simonmacdonald) for his post on googledocs.

    0 讨论(0)
  • 2020-11-27 04:30

    Jerome's answer works like a charm.. the only thing to point out to people when they want to use the file don't use entry.fullPath as this can sometimes cause issues, use entry.toURL() as this will give you the full path without having to add "file://" to the path as well as bypassing issues such as SD card storage..

    0 讨论(0)
提交回复
热议问题