无法在iOS上使用Xamarin和MvvmCross拍照

时间:2018-09-27 21:26:22

标签: ios visual-studio xamarin mvvmcross

我正在开发一个iOS应用,该应用必须能够拍照(以做一些事情)。

我将Xamarin与MvvmCross 6.2.0一起使用,并且已导入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_msg发送+ 217     4 ??? 0x0000000141e58257 0x0 + 5400527447

     
    

at 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

         

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

         

at(包装器从本机到托管)ObjCRuntime.Runtime.throw_ns_exception(intptr)     ---从前一个引发异常的位置开始的堆栈跟踪---(包装器托管到本地)     ObjCRuntime.Messaging.void_objc_msgSend_Int64(intptr,intptr,long)在     UIKit.UIImagePickerController.set_SourceType     (UIKit.UIImagePickerControllerSourceType值)在[0x00015]中     /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]在<8539a731432e4b45b49dd5ca22de5afd>:0中     xxx.DoTakePictureCommand     ()[0x0000d] in     C:\ Users \ xxxx \ Documents \ IdeaProjects \ xxxx \ xxxx \ XXX.Core \ ViewModels \ AddExpenseViewModel.cs:447       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_msg发送+ 217 4 ???
    0x0000000141e58257 0x0 + 5400527447 2018-09-27 23:15:03.294036 + 0200     xxxiOS [46563:4418172] 2018-09-27 11:15:03 [TRACE]     (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找到。假设儿童动画演示     CalabashServer | XTC_SKIP_LPSERVER_TOKEN不在应用程序环境中     CalabashServer |将以标识符启动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

2 个答案:

答案 0 :(得分:0)

您的问题与您要传递的变量有关,请检查它是否不为null且类型为int

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

来自docs

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

答案 1 :(得分:0)

好的,钉上它!

我将在这里为其他遇到此问题的应用程序开发新手留下解决方案。

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

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

到Info.plist。

直到我决定删除MvvmCross.Plugin.PictureChooser并使用Xam.Plugin.Media时,我才得到了一条可以理解的错误消息-基本上是这样的:“您需要在Info中添加NSCameraUsageDescription。自iOS 10以来plist“