c# - 我得到“无法连接到相机服务”,所以我不能使用相机硬件
问题描述
我是 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()。
谢谢
解决方案
我创建了一个新项目 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;
推荐阅读
- java - spring shell 2中的命令颜色
- python - 如何在 Python 中为 WPF 定义用户控件?
- c# - 用于 360° 图像查看器的球体的统一旋转
- c# - 如何使用我在当前解决方案中引用的项目中引用项目的类/方法?
- ios - 在 Jenkins 上使用 fastlane 构建问题失败
- javascript - 升级到 Meteor 1.7.0.5 的项目无法启动
- sql - 使用 CHARINDEX 子串
- javascript - 以编程方式将自定义内容插入到 Intent Confirmation 消息中?
- sinon - sinon 期望仅验证属性的子集
- omnet++ - 在 SimuLTE 切换示例中添加多个文件传输 DL-UL 通信