【问题标题】:How to open photo gallery by clicking a button from a camera overlay?如何通过单击相机叠加层中的按钮打开照片库?
【发布时间】:2013-11-07 00:53:08
【问题描述】:

我正在使用 Titanium SDK 3.1.2 并为 iOS 和 Android 进行部署。 您可以找到我的叠加层HERE 的代码。我这样做是因为代码很大并且希望我的问题清晰明了。 我正在尝试使用以下功能为相机创建自己的叠加层: 拍张照片。 显示摄像机。 打开画廊。 关闭相机。 我可以关闭相机并拍照,但无法打开照片库。我的galleryButton 有一个像这样的singletap 事件:

galleryButton.addEventListener("singletap", function(e){
        openKineduPhotoGallery();
        Ti.Media.hideCamera();
    });

但是当我这样做时没有任何反应,之后我无法关闭相机也无法拍照。如果我尝试拍照,我会收到以下错误:

Script Error {
        backtrace = "#0 () at file://localhost/var/mobile/Applications/79D9256C-7782-4323-A371-1AD45B37D037/Full.app/ui/common/GenericWindow.js:1\n#1 () at file://localhost/var/mobile/Applications/79D9256C-7782-4323-A371-1AD45B37D037/Full.app/ui/common/CreateMoment.js:1";
        line = 1;
        message = "'null' is not an object (evaluating 'o.type')";
        name = TypeError;
        sourceId = 81147840;
        sourceURL = "file://localhost/var/mobile/Applications/79D9256C-7782-4323-A371-1AD45B37D037/Full.app/ui/common/GenericWindow.js";
    }

我无法弄清楚是什么对象变为 null 以使其出现。 我尝试交换调用方法的顺序,使其看起来像这样:

galleryButton.addEventListener("singletap", function(e){
        Ti.Media.hideCamera();
        openKineduPhotoGallery();
    });

但这只是隐藏了相机,根本不显示画廊,而且我在 iOS 中收到以下警告:

Nov  6 18:37:20 Nenvo-iPod Full[3240] <Warning>: *** Assertion failure in -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:], /SourceCache/UIKit/UIKit-2380.17/UIWindowController.m:211
Nov  6 18:37:20 Nenvo-iPod Full[3240] <Warning>: Warning: Attempt to dismiss from view controller <UIImagePickerController: 0x1e5e17a0> while a presentation or dismiss is in progress!

我以为是 hideCamera 方法错误,所以我对此进行了评论,但这只会触发 showCamera 方法上的错误函数,我得到一个 JSON 错误对象,如下所示:

{
  "type": "error",
  "code": 1,
  "source": [object MediaModule],
  "success": false
}

我尝试对 MediaModule 进行字符串化,但它只返回了一个空对象。 甚至可以从相机覆盖打开画廊吗?我有哪些选择?我正在尝试实现类似于 instagram 拍照、录制视频和从图库中选择图片的工作流程。

【问题讨论】:

    标签: android ios camera titanium appcelerator


    【解决方案1】:

    回答以下问题实际上是当您调用 hideCamera 并打开 PhotoGallery 时,两者都作为模态窗口打开,因此我们需要在摩擦几秒钟后调用 openKineduPhotoGallery 函数。

    galleryButton.addEventListener("singletap", function(e){
            Ti.Media.hideCamera();
            openKineduPhotoGallery();
    });
    

    所以你应该试试下面的代码。

       galleryButton.addEventListener("singletap", function(e){
                Ti.Media.hideCamera();
                setTimeout(function(){
                        openKineduPhotoGallery();                   
                },500);
        });
    

    【讨论】:

    • 不错的方法,但是从相机切换到画廊之间仍然存在一些滞后,有时会崩溃,希望我能找到更好的方法
    • 您可以尝试将测试时间从 500 增加到 1000。
    • 我所说的滞后是关闭相机并显示之前显示的窗口然后打开画廊,它可能会给用户留下错误的印象(好像画廊崩溃)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    相关资源
    最近更新 更多