Xamarin.Forms 相机控制访问 DependencyService

Posted

技术标签:

【中文标题】Xamarin.Forms 相机控制访问 DependencyService【英文标题】:Xamarin.Forms Camera Control Access DependencyService 【发布时间】:2016-12-08 21:10:54 【问题描述】:

我正在寻找适用于 Visual Studio 的工作示例 Xamarin.Forms 解决方案,该解决方案将展示如何使用 DependencyService 接口访问 androidios 设备的相机控件。我正在调用通过可移植类库中的按钮单击事件拍照的能力。

我需要能够限制使用设备上的某些相机控件,同时允许将使用我正在开发的应用程序的用户访问其他相机控件,然后他们才能拍照并保存。

我尝试了多种解决方案,包括在Camera access with Xamarin.Forms 找到的解决方案,但没有奏效。

【问题讨论】:

您是如何尝试找到的解决方案的?你能展示一些你的项目的错误信息和一些关键代码吗? 【参考方案1】:

Media plugin for Xamarin 是访问设备内置摄像头功能的一个很好的例子。

听起来您的要求略有不同。您需要对相机页面的 UI 进行更多控制。您可以考虑制作自己的自定义相机页面。 here 有一个很好的例子。它实现了一个相机预览页面,您可以在其中创建 UI 控件。这使用自定义渲染器。

// The control used in shared code
public class CameraPreview : View

  public static readonly BindableProperty CameraProperty = BindableProperty.Create (
    propertyName: "Camera",
    returnType: typeof(CameraOptions),
    declaringType: typeof(CameraPreview),
    defaultValue: CameraOptions.Rear);

  public CameraOptions Camera 
    get  return (CameraOptions)GetValue (CameraProperty); 
    set  SetValue (CameraProperty, value); 
  


// Renderer for iOS, platform specific project
[assembly: ExportRenderer (typeof(CameraPreview), 
typeof(CameraPreviewRenderer))]
namespace CustomRenderer.iOS

    public class CameraPreviewRenderer : ViewRenderer<CameraPreview, UICameraPreview>
    
        UICameraPreview uiCameraPreview;

        protected override void OnElementChanged (ElementChangedEventArgs<CameraPreview> e)
        
            base.OnElementChanged (e);

            if (Control == null) 
                uiCameraPreview = new UICameraPreview (e.NewElement.Camera);
                SetNativeControl (uiCameraPreview);
            
            if (e.OldElement != null) 
                // Unsubscribe
                uiCameraPreview.Tapped -= OnCameraPreviewTapped;
            
            if (e.NewElement != null) 
                // Subscribe
                uiCameraPreview.Tapped += OnCameraPreviewTapped;
            
        

        void OnCameraPreviewTapped (object sender, EventArgs e)
        
            if (uiCameraPreview.IsPreviewing) 
                uiCameraPreview.CaptureSession.StopRunning ();
                uiCameraPreview.IsPreviewing = false;
             else 
                uiCameraPreview.CaptureSession.StartRunning ();
                uiCameraPreview.IsPreviewing = true;
            
        
        ...
    

查看以上其他平台的链接。还有另一个制作自定义相机页面并在Moments sample 中捕获图像的示例。您可以在每个渲染器中看到一个按钮用于处理捕获图像。这使您可以更好地控制用户可以/不能做什么。

如果您在相机中包含更多关于您需要限制什么的具体信息,我也许可以用更多细节进行编辑。

【讨论】:

嗨,约翰!感谢你的回复!我决定使用在Full Camera Page 找到的自定义页面。我仍然需要在 android 项目中添加滑块类型控件以使相机缩放、将纵横比设置为 4:3 并使相机仅在横向模式下拍照。

以上是关于Xamarin.Forms 相机控制访问 DependencyService的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Forms Java.Lang.RuntimeException:无法连接到相机服务

如何使用 Xamarin.Forms.DependencyService 注入具有构造函数注入的 ViewModel

PageRenderer中的Xamarin.Forms UINavigationBar

Xamarin - 在 WebView 中请求相机权限

让你的Xamarin.Forms应用程序访问

在 Xamarin.Forms 中直接访问 Sql Server 数据库