在iOS上拍照时,Titanium App会冻结

时间:2013-11-17 14:53:23

标签: titanium titanium-alloy

环境:iOS 7.0.3& 6.1.3,在iPhone设备上测试(几个独立的设备)。 Ti v 3.1.3与合金1.2.2。

我在设备上拍照时我的应用程序冻结了。从图库中选择照片可以毫无问题地工作,但在拍照时,应用程序会在移动和缩放屏幕上冻结 - 看似在点击“使用”按钮后。我的代码如下:

$.avatar.addEventListener("click", function() {

    var opts = {
        cancel : 2,
        options : ['Take a Photo', 'Select from Gallery', 'Cancel'],
        selectedIndex : 2,
        destructive : 0,
        title : 'Set a Profile Photo:'
    };

    var dialog = Ti.UI.createOptionDialog(opts);
    dialog.show();

    dialog.addEventListener("click", function(e) {
        switch(e.index) {

            case(0):
                Titanium.Media.showCamera({
                    allowEditing : true,
                    success : function(event) {
                        $.avatar.status = "new";
                        $.avatar.image = event.media;
                    },

                    error : function(event) {
                        console.log(event);
                    }
                });

            case(1):
                Titanium.Media.openPhotoGallery({
                    allowEditing : true,
                    success : function(event) {
                        $.avatar.status = "new";
                        $.avatar.image = event.media;
                    },

                    error : function(event) {
                        console.log(event);
                    }
                });

            }
        });
});

此处所需的行为是用户点击他们的头像,打开选项菜单。然后他们点击“拍照”,打开相机,让他们拍照并剪裁。点击“使用”后,该照片将显示在$ .avatar ImageView中。

我已经能够在我测试的每个设备上,在多个iOS版本上重现这一点。这是合金或TI中的错误,还是我在这里做了一些明显的错误? 谢谢!

2 个答案:

答案 0 :(得分:0)

我正在做同样的事情,我在这里有代码片段希望它可以帮助你:

var options = {

                        success: function(e) { 
                            // var tempDate = new Date().getTime();
                            var completeSubfix = rcvImage.subfix + APP.uniqueIdCounter(sectionId);
                            var noDashPlatformId = Titanium.Platform.id.replace(/-/g,"");
                            var imageName = result[0].parentAccount + "-" +result[0].id_user + "-" + noDashPlatformId + "-" + completeSubfix;
                            urls[rcvImage.id] = Ti.Filesystem.applicationDataDirectory+ imageName+ '.png';

                            var tmpPhoto = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, imageName + '.png');
                            tmpPhoto.write(e.media);

                            var useHeight = true;

                            if(OS_ANDROID){
                                //If in portrait, we use this variable to invert the cropping.
                                useHeight = e.cropRect.height <  e.cropRect.width ? true : false; 
                            }

                            //Creating thumbnail for both OS
                            var thumbnailtmp = e.media.imageAsThumbnail(180, 1,2);


                            if(OS_ANDROID){
                                //Making it a rectangle again so it wont get streched on the image view
                                thumbnailtmp =  thumbnailtmp.imageAsCropped({
                                    width:  useHeight ?  180 : 122, 
                                    height: useHeight ?  122 : 180,
                                    x:0,
                                    y:0
                                }); 
                            }


//                                      
                            var thumbnail = Ti.UI.createImageView({
                                image: thumbnailtmp
                            });

                            var tmpPhoto = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, imageName + '_thum.png');
                            tmpPhoto.write(thumbnail.image);

                            rcvImage.image = tmpPhoto.nativePath;
                            //rcvImage.image = APP.getThumbnailMedium(urls[rcvImage.id] ,"medium");
                            if(OS_IOS){
                                rcvImage.children[0].opacity = 0.6;
                                rcvImage.children[1].text = completeSubfix;
                            }
                            else{
                                rcvImage.parent.children[1].opacity = 0.6;  
                                rcvImage.parent.children[2].text = completeSubfix;                          
                            }
                            _callback(rcvImage);

                        },

                        cancel:function() {
                        // called when user cancels taking a picture
                        },
                        error:function(error) {
                            // called when there's an error
                            var a = Titanium.UI.createAlertDialog({title:'Camera'});
                            if (error.code == Titanium.Media.NO_CAMERA) {
                                a.setMessage('Please run this test on device');
                            } else {
                                a.setMessage('Unexpected error: ' + error.code);
                            }
                            a.show();
                        },

            };


                Ti.Media.showCamera(options);

答案 1 :(得分:0)

这个问题的答案非常简单,基本上令人尴尬。我忘了在每个案例结尾处包含break;,导致switch语句在拍摄照片时贯穿两种情况。添加它来解决问题。

-1表示n00b级错误。