【问题标题】:Unable to take picture with Xamarin and MvvmCross on iOS无法在 iOS 上使用 Xamarin 和 MvvmCross 拍照
【发布时间】:2019-03-03 20:43:40
【问题描述】:

我正在开发一个 iOS 应用,它需要能够拍照(用来做一些事情)。

我正在使用带有 MvvmCross 6.2.0 的 Xamarin 并已导入 MvxPictureChooser 插件。

我已将 NSPhotoLibraryAddUsageDescription 添加到我的 Info.plist 中

...
<key>NSPhotoLibraryAddUsageDescription</key>
<string>This app needs to be able to save your expense attachments as images.</string>
<key>UIRequiresFullScreen</key>
<true/>
...

现在,当我尝试使用 ChoosePictureFromLibrary 时,一切顺利。

另一方面,如果我尝试使用 TakePicture(int, int, Action, Action),我得到一个包含错误的异常:NSInvalidArgumentException 原因:源类型 1 不可用

我的代码如下所示:

private void DoTakePictureCommand()
    {
        var picChooser = Mvx.IoCProvider.Resolve<IMvxPictureChooserTask>();
        try
        {
            picChooser.TakePicture(_envProvider.Environment.JpegSize, _envProvider.Environment.JpegQuality, (stream) =>
            {
                using (var ms = new MemoryStream())
                {
                    stream.CopyToAsync(ms);
                    ReceiptJpegData = ms.ToArray();

                    _log.Trace("Picture bytes: {0}", ReceiptJpegData.Length);

                    InvokeOnMainThread(ImageComplete);
                }
            }, () =>
            {

            });
        }
        catch (Exception e)
        {
            Debug.Write(e);
        }
    }

完整的错误在这里:

[0:] Foundation.MonoTouchException:抛出了 Objective-C 异常。名称:NSInvalidArgumentException 原因:源类型 1 不可用 本机堆栈跟踪:

0 CoreFoundation 0x000000011c41429b __exceptionPreprocess + 331 1 libobjc.A.dylib 0x000000011d2e8735 objc_exception_throw + 48 2 UIKitCore 0x0000000126d03553-[UIImagePickerController sourceType] + 0 3 xxxiOS 0x000000010ed801b9 xamarin_dyn_objc_msgSend + 217 4 ??? 0x0000000141e58257 0x0 + 5400527447

在 ObjCRuntime.Runtime.ThrowNSException (System.IntPtr ns_exception) [0x00000] 中 /Library/Frameworks/Xamarin.iOS.framework/Versions/12.0.0.15/src/Xamarin.iOS/ObjCRuntime/Runtime.cs:398

在 ObjCRuntime.Runtime.throw_ns_exception (System.IntPtr exc) [0x00000] 中 /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/runtime/Delegates.generated.cs:126

在(包装器本机到托管)ObjCRuntime.Runtime.throw_ns_exception(intptr) --- 从先前抛出异常的位置结束堆栈跟踪 --- 在(包装器托管到本机) ObjCRuntime.Messaging.void_objc_msgSend_Int64(intptr,intptr,long) 在 UIKit.UIImagePickerController.set_SourceType (UIKit.UIImagePickerControllerSourceType 值) [0x00015] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.0.0.15/src/Xamarin.iOS/UIKit/UIImagePickerController.g.cs:587 在 MvvmCross.Plugin.PictureChooser.Platforms.Ios.MvxImagePickerTask.TakePicture (System.Int32 maxPixelDimension, System.Int32 percentQuality, System.Action`1[T] 图片可用,System.Action 假设已取消) [0x00014] 在 :0 中 xxx.DoTakePictureCommand () [0x0000d] 在 C:\Users\xxxx\Documents\IdeaProjects\xxxx\xxxx\XXX.Core\ViewModels\AddExpenseViewModel.cs:447 0 核心基础 0x000000011c41429b __exceptionPreprocess + 331 1 libobjc.A.dylib 0x000000011d2e8735 objc_exception_throw + 48 2 UIKitCore
0x0000000126d03553 -[UIImagePickerController sourceType] + 0 3
xxxiOS 0x000000010ed801b9 xamarin_dyn_objc_msgSend + 217 4 ???
0x0000000141e58257 0x0 + 5400527447 2018-09-27 23:15:03.294036+0200 xxxiOS[46563:4418172] 2018-09-27 11:15:03 [跟踪] (MvvmCross.Logging.MvxLog) iOS导航 2018-09-27 23:15:03.294886+0200 xxxiOS[46563:4418172] 2018-09-27 11:15:03 [TRACE] (MvvmCross.Logging.MvxLog) PresentationAttribute 不 为 AddExpenseView 找到。假设动画儿童演示 葫芦服务器 | XTC_SKIP_LPSERVER_TOKEN 不在应用环境中 葫芦服务器 |将使用标识符启动 LPServer: c36c12ce937d044d55d0c208f9d4502868233513

更新

我现在尝试将代码部署到已更新到 iOS 12 的 iPhone 7 上,但应用程序在尝试启动相机时立即崩溃。

我也尝试过硬编码 int 值:

private void DoTakePictureCommand()
{
    var picChooser = Mvx.IoCProvider.Resolve<IMvxPictureChooserTask>();
    try
    {
        picChooser.TakePicture(640, 50, (stream) =>
        {
            using (var ms = new MemoryStream())
            {
                stream.CopyToAsync(ms);
                ReceiptJpegData = ms.ToArray();

                _log.Trace("Picture bytes: {0}", ReceiptJpegData.Length);

                InvokeOnMainThread(ImageComplete);
            }
        }, () =>
        {

        });
    }
    catch (Exception e)
    {
        Debug.Write(e);
    }
}

但结果是一样的。

更新

我创建了一个复制问题的小型示例项目。该应用程序同时使用选择图片和拍照 - 仅选择图片作品。我已将其发布到 Github 上的公共仓库:PictureApp

【问题讨论】:

  • 你是在物理设备上测试这个吗?
  • 不,我正在使用 iPhoneSimulator 进行测试。
  • 我认为这就是问题所在。我不相信模拟器有工作的相机
  • 不幸的是,这似乎不是问题。调用 TakePicture 后,该应用程序会在我的手机上崩溃。

标签: ios visual-studio xamarin mvvmcross


【解决方案1】:

你的问题和你传递的变量有关,检查它是否不为null并且它的类型是int

_envProvider.Environment.JpegSize, 
_envProvider.Environment.JpegQuality,

来自docs

 void TakePicture(int maxPixelDimension, int percentQuality, Action<Stream> pictureAvailable,
                     Action assumeCancelled);

【讨论】:

  • 我尝试使用硬编码的 int 值(如我对帖子的更新中所见),但我得到了相同的结果。
【解决方案2】:

好的,成功了!

我将在此处为遇到此问题的其他应用程序开发新手提供解决方案。

问题的解决方法其实很简单:我所要做的就是添加

<key>NSCameraUsageDescription</key>
<string></string>

到 Info.plist。

直到我决定放弃 MvvmCross.Plugin.PictureChooser 并改用 Xam.Plugin.Media 时,我才收到一条可以理解的错误消息 - 基本上类似于:“您需要将 NSCameraUsageDescription 添加到 Info.从 iOS 10 开始的 plist"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多