using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Android; using Android.App; using Android.Content; using Android.Content.PM; using Android.Graphics; using Android.Hardware.Camera2; using Android.Media; using Android.OS; using Android.Provider; using Android.Runtime; using Android.Util; using Android.Views; using Android.Widget; namespace Camera2BarcodeScanner { public class CameraPreview : SurfaceView, ISurfaceHolderCallback { private CameraManager _cameraManager; private CameraDevice _cameraDevice; private CameraCaptureSession _captureSession; private CaptureRequest.Builder _previewBuilder; private Size _previewSize; private ImageReader _imageReader; private BarcodeDetector _barcodeDetector; private MainActivity _mainActivity; private CameraStateListener _stateListener; public CameraPreview(Context context, MainActivity mainActivity) : base(context) { _mainActivity = mainActivity; Holder.AddCallback(this); Holder.SetType(SurfaceType.PushBuffers); _stateListener = new CameraStateListener { OnDisconnectedAction = Stop }; _barcodeDetector = new BarcodeDetector.Builder(context) .SetBarcodeFormats(BarcodeFormat.QrCode) .Build(); } public void SurfaceCreated(ISurfaceHolder holder) { _cameraManager = (CameraManager)_mainActivity.GetSystemService(Context.CameraService); var cameraId = _mainActivity.GetCameraId(_cameraManager).Result; var cameraCharacteristics = _cameraManager.GetCameraCharacteristics(cameraId); var streamConfigurationMap = (StreamConfigurationMap)cameraCharacteristics.Get(CameraCharacteristics.ScalerStreamConfigurationMap); _previewSize = streamConfigurationMap.GetOutputSizes(SurfaceTexture.Class)[0]; var permission = _mainActivity.CheckSelfPermission(Manifest.Permission.Camera); if (permission != Permission.Granted) { _mainActivity.RequestPermissions(new[] { Manifest.Permission.Camera }, 0); return; } _cameraManager.OpenCamera(cameraId, _stateListener, null); } public void SurfaceChanged(ISurfaceHolder holder, [GeneratedEnum] Format format, int width, int height) { // Do nothing } public void SurfaceDestroyed(ISurfaceHolder holder) { Stop(); } private async Task StartPreview() { var surface = Holder.Surface; _previewBuilder = _cameraDevice.CreateCaptureRequest(CameraTemplate.Preview); _previewBuilder.AddTarget(surface); _imageReader = ImageReader.NewInstance(_previewSize.Width, _previewSize.Height, ImageFormatType.Jpeg, 2); _imageReader.SetOnImageAvailableListener(new Camera2ImageAvailableListener(_mainActivity), null); _previewBuilder.AddTarget(_imageReader.Surface); var outputs = new List { surface, _imageReader.Surface }; await _cameraDevice.CreateCaptureSessionAsync(outputs, new Camera2CaptureSessionListener(this), null); } public async void TakePicture() { if (_cameraDevice == null) return; _imageReader = ImageReader.NewInstance(_previewSize.Width, _previewSize.Height, ImageFormatType.Jpeg, 1); _imageReader.SetOnImageAvailableListener(new Camera2ImageAvailableListener(_mainActivity), null); var captureBuilder = _cameraDevice.CreateCaptureRequest(CameraTemplate.StillCapture); captureBuilder.AddTarget(_imageReader.Surface); var captureSessionListener = new Camera2CaptureSessionListener(this); await _cameraDevice.CreateCaptureSessionAsync(new List このコードは、SurfaceViewを使用してAndroidのカメラを起動し、プレビュー画像を表示し、バーコードスキャンを行うアプリケーションです。