捕获相机拍摄的照片并将其存储到本地数据库/ PhoneGap / Cordova / iOS中



我目前正在使用Phonegap/Cordova和jQuerymobile为iOS构建一个应用程序。这个想法是用相机拍照并存储捕获的图像以备将来使用。我想将路径/文件名存储到我的本地数据库中,并将图片文件移动到iPhone中的持久位置。

有人可以给我举个例子吗?

好的,这是解决方案。

  • 在 Html 文件中

  • 我有一个图像标签,用于显示相机拍摄的照片:

  • 我有一个按钮可以运行拍照功能:拍摄照片

  • 拍摄照片
  • 的功能是(拍摄照片时,"smallImage"ID 的 scr 填充照片的路径)

    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);
    }
    
  • 现在我想将图片移动到永久文件夹中,然后将链接保存到我的数据库中:

    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);
    }
    
  • 我的文件已保存在数据库中以显示它,我将"file://"放在包含图像 src 的行前面

希望这有帮助。J.

附言 :- 非常感谢Simon Mac Donald(http://hi.im/simonmacdonald)在googledocs上的帖子。

杰罗姆的回答就像一个魅力......当人们想要使用该文件时,唯一要指出的是不要使用 entry.fullPath,因为这有时会导致问题,请使用 entry.toURL(),因为这将为您提供完整路径,而无需在路径中添加"file://"以及绕过 SD 卡存储等问题。

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");
    }
}

我只是根据杰罗姆上面的回答做了一个与承诺一起工作:

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);
}

有 3 个步骤:

  1. 获取照片。 苹果在iPhone开发网站上有一个很好的例子
  2. 获取文档目录,如下所示:
    
    NSArray *arrayPaths = NSSearchPathForDirectoriesInDomains(
                NSDocumentDirectory,
                NSUserDomainMask,
                YES);
    NSString *docDir = [arrayPaths objectAtIndex:0];
    
  3. 最后,将您在步骤 1 中获得的 UIImage 存储到磁盘:
    
    NSString *filename = @"mypic.png";
    NSString *fullpath = [docDir stringByAppendingPathComponent:filename];
    [UIImagePNGRepresentation(image) writeToFile:fullpath atomically:YES];
    

最新更新