/
CameraInfo.cs
115 lines (98 loc) · 3.38 KB
/
CameraInfo.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.Hardware;
using Android.Hardware.Camera2;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
namespace WorkWithCamera
{
public class CameraInfo
{
CameraManager _cameraManager;
Camera.CameraInfo _info;
IWindowManager _windowManager;
Dictionary<CameraFacing, int> _fromFacingToID;
public CameraInfo(CameraManager cameraManager, IWindowManager windowManager)
{
_cameraManager = cameraManager;
_windowManager = windowManager;
_info = new Camera.CameraInfo();
_fromFacingToID = DictionaryCameraFacing();
}
public CameraFacing GetCameraFacing(int cameraID)
{
Camera.GetCameraInfo(cameraID, _info);
return _info.Facing;
}
public int GetID(CameraFacing cameraFacing)
=> _fromFacingToID[cameraFacing];
public int NumberOfCameras()
=> _cameraManager.GetCameraIdList().Length;
public int GetOrientation(int cameraID)
{
Camera.GetCameraInfo(cameraID, _info);
return _info.Orientation;
}
public int CalculateRotationAngle(int cameraId)
{
// определяем насколько повернут экран от нормального положения
int degrees = GetSurfaceOrientation();
int result = 0;
// получаем инфо по камере cameraId
Camera.GetCameraInfo(cameraId, _info);
if (_info.Facing == Camera.CameraInfo.CameraFacingBack)
result = ((360 - degrees) + _info.Orientation) % 360;
else if (_info.Facing == Camera.CameraInfo.CameraFacingFront)
{
result = (360 + _info.Orientation + degrees) % 360;
}
//else
//{
// result = (360 + _info.Orientation - degrees) % 360;
//}
//{
// result = ((360 - degrees) - _info.Orientation);
// result += 360;
//}
return result;
}
private int GetSurfaceOrientation()
{
SurfaceOrientation rotation = _windowManager.DefaultDisplay.Rotation;
int degrees = 0;
switch (rotation)
{
case SurfaceOrientation.Rotation0:
degrees = 0;
break;
case SurfaceOrientation.Rotation90:
degrees = 90;
break;
case SurfaceOrientation.Rotation180:
degrees = 180;
break;
case SurfaceOrientation.Rotation270:
degrees = 270;
break;
}
return degrees;
}
private Dictionary<CameraFacing, int> DictionaryCameraFacing()
{
var keyValuePairs = new Dictionary<CameraFacing, int>();
string[] cameraIds = _cameraManager.GetCameraIdList();
foreach(var id in cameraIds)
{
int ID = int.Parse(id);
keyValuePairs[GetCameraFacing(ID)] = ID;
}
return keyValuePairs;
}
}
}