首页 > 解决方案 > 我得到“无法连接到相机服务”,所以我不能使用相机硬件

问题描述

我是 xamarin android 的新手。然后我尝试访问相机并在纹理视图上显示相机视图流。所以我按照本指南进行操作,但我调试项目然后出现错误“无法连接到相机服务”,尽管我在 AndroidManifest.xml 中添加了该错误。

这是我的 Activity.cs 代码

    public class MainActivity : AppCompatActivity, TextureView.ISurfaceTextureListener
    {
        Camera _camera;
        TextureView _textureView;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);

            _textureView = new TextureView(this);
            _textureView.SurfaceTextureListener = this;

            SetContentView(_textureView);
        }

        public void OnSurfaceTextureAvailable(Android.Graphics.SurfaceTexture surface, int w, int h)
        {
            _camera = Camera.Open();

            _textureView.LayoutParameters = new FrameLayout.LayoutParams(w, h);

            try
            {
                _camera.SetPreviewTexture(surface);
                _camera.StartPreview();

            }
            catch (Java.IO.IOException ex)
            {
                System.Console.WriteLine(ex.Message);
            }
        }
        public bool OnSurfaceTextureDestroyed(Android.Graphics.SurfaceTexture surface)
        {
            _camera.StopPreview();
            _camera.Release();

            return true;
        }


        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }

        public void OnSurfaceTextureSizeChanged(Android.Graphics.SurfaceTexture surface, int width, int height)
        {
            System.Console.WriteLine("Size Changed");
        }

        public void OnSurfaceTextureUpdated(Android.Graphics.SurfaceTexture surface)
        {
            System.Console.WriteLine("Texture Updated");
        }
    }

错误发生在“OnSurfaceTextureAvailable”方法的 _camera = Camera.Open()。

谢谢

标签: c#androidxamarin

解决方案


我创建了一个新项目 xamarin native android 并测试此代码,并在 Android 10 上为我工作:

    [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
    public class MainActivity : AppCompatActivity, TextureView.ISurfaceTextureListener
    {
        Camera _camera;
        TextureView _textureView;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            // Set our view from the "main" layout resource

            _textureView = new TextureView(this);
            _textureView.SurfaceTextureListener = this;
            SetContentView(_textureView);

        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }

        public void OnSurfaceTextureAvailable(Android.Graphics.SurfaceTexture surface, int width, int height)
        {
            if (Camera.NumberOfCameras == 0)
            {
                Toast.MakeText(this, "This app requires a camera", ToastLength.Long).Show();
                return;
            }
            _camera = Camera.Open();
            if (_camera == null)
                _camera = Camera.Open(0);
            var previewSize = _camera.GetParameters().PreviewSize;
            _textureView.LayoutParameters =
                new FrameLayout.LayoutParams(previewSize.Width, previewSize.Height, GravityFlags.Center);
            try
            {
                _camera.SetPreviewTexture(surface);
                _camera.StartPreview();
            }
            catch (Java.IO.IOException ex)
            {
                Console.WriteLine(ex.Message);
            }
            // this is the sort of thing TextureView enables  
            _textureView.Rotation = 45.0f;
            _textureView.Alpha = 0.5f;
        }
        public bool OnSurfaceTextureDestroyed(Android.Graphics.SurfaceTexture surface)
        {
            _camera.StopPreview();
            _camera.Release();
            return true;
        }
        public void OnSurfaceTextureSizeChanged(Android.Graphics.SurfaceTexture surface, int width, int height)
        {
            // camera takes care of this  
        }
        public void OnSurfaceTextureUpdated(Android.Graphics.SurfaceTexture surface) { }

    }

然后打开属性选项,选择Android Manifest-->Required Permissions-->check CAMERA

我认为您有权限问题,如果您有 android 6 或更高版本,您需要转到设备中的应用管理器并允许相机权限或以编程方式设置请求权限,例如:

int requestPermissions;
string cameraPermission = Android.Manifest.Permission.Camera;

if (!(ContextCompat.CheckSelfPermission(this, cameraPermission) == (int)Permission.Granted)) {
                ActivityCompat.RequestPermissions(this, new String[] { cameraPermission, }, requestPermissions);
}

并请在您的 MainActivity 中使用此命名空间:

//namespace  
using Android.Hardware;  

推荐阅读