@capacitor-community/camera-preview 2.1.0 → 4.0.0-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/CapacitorCommunityCameraPreview.podspec +1 -1
  2. package/README.md +5 -3
  3. package/android/build.gradle +16 -11
  4. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  5. package/android/gradlew +182 -108
  6. package/android/src/androidTest/java/com/getcapacitor/android/ExampleInstrumentedTest.java +3 -3
  7. package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraActivity.java +835 -799
  8. package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraPreview.java +184 -173
  9. package/android/src/main/java/com/ahm/capacitor/camera/preview/CustomSurfaceView.java +12 -14
  10. package/android/src/main/java/com/ahm/capacitor/camera/preview/CustomTextureView.java +16 -18
  11. package/android/src/main/java/com/ahm/capacitor/camera/preview/Preview.java +327 -323
  12. package/android/src/main/java/com/ahm/capacitor/camera/preview/TapGestureDetector.java +15 -14
  13. package/android/src/test/java/com/getcapacitor/ExampleUnitTest.java +4 -3
  14. package/dist/esm/definitions.d.ts +10 -8
  15. package/dist/esm/index.js +1 -1
  16. package/dist/esm/index.js.map +1 -1
  17. package/dist/esm/web.d.ts +3 -3
  18. package/dist/esm/web.js +36 -25
  19. package/dist/esm/web.js.map +1 -1
  20. package/ios/Plugin/CameraController.swift +106 -129
  21. package/ios/Plugin/Plugin.swift +76 -90
  22. package/ios/Plugin.xcodeproj/project.pbxproj +6 -4
  23. package/ios/PluginTests/PluginTests.swift +8 -8
  24. package/ios/Podfile +1 -1
  25. package/package.json +31 -6
  26. package/android/.gradle/4.10.1/fileChanges/last-build.bin +0 -0
  27. package/android/.gradle/4.10.1/fileHashes/fileHashes.bin +0 -0
  28. package/android/.gradle/4.10.1/fileHashes/fileHashes.lock +0 -0
  29. package/android/.gradle/4.10.1/gc.properties +0 -0
  30. package/android/.gradle/vcs-1/gc.properties +0 -0
  31. package/android/.idea/compiler.xml +0 -6
  32. package/android/.idea/gradle.xml +0 -20
  33. package/android/.idea/jarRepositories.xml +0 -45
  34. package/android/.idea/libraries/Gradle__androidx_activity_activity_1_2_0_aar.xml +0 -14
  35. package/android/.idea/libraries/Gradle__androidx_activity_activity_1_2_3_aar.xml +0 -14
  36. package/android/.idea/libraries/Gradle__androidx_annotation_annotation_1_1_0.xml +0 -9
  37. package/android/.idea/libraries/Gradle__androidx_annotation_annotation_1_2_0.xml +0 -9
  38. package/android/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_0_0_aar.xml +0 -11
  39. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_2_0_aar.xml +0 -14
  40. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_3_0_aar.xml +0 -14
  41. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_2_0_aar.xml +0 -11
  42. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_3_0_aar.xml +0 -11
  43. package/android/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml +0 -9
  44. package/android/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml +0 -11
  45. package/android/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml +0 -9
  46. package/android/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml +0 -14
  47. package/android/.idea/libraries/Gradle__androidx_core_core_1_3_2_aar.xml +0 -14
  48. package/android/.idea/libraries/Gradle__androidx_core_core_1_5_0_aar.xml +0 -14
  49. package/android/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml +0 -11
  50. package/android/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml +0 -11
  51. package/android/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml +0 -14
  52. package/android/.idea/libraries/Gradle__androidx_exifinterface_exifinterface_1_3_2_aar.xml +0 -14
  53. package/android/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_0_aar.xml +0 -14
  54. package/android/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_4_aar.xml +0 -14
  55. package/android/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml +0 -11
  56. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_3_0.xml +0 -9
  57. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_3_1.xml +0 -9
  58. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml +0 -11
  59. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_0_aar.xml +0 -11
  60. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml +0 -11
  61. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_3_0_aar.xml +0 -11
  62. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_3_1_aar.xml +0 -11
  63. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_0_aar.xml +0 -11
  64. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml +0 -11
  65. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_0_aar.xml +0 -11
  66. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml +0 -11
  67. package/android/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml +0 -11
  68. package/android/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml +0 -11
  69. package/android/.idea/libraries/Gradle__androidx_test_core_1_3_0_aar.xml +0 -11
  70. package/android/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_1_0_alpha3_aar.xml +0 -11
  71. package/android/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_3_0_aar.xml +0 -11
  72. package/android/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_1_0_alpha3_aar.xml +0 -11
  73. package/android/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_3_0_aar.xml +0 -11
  74. package/android/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_2_aar.xml +0 -11
  75. package/android/.idea/libraries/Gradle__androidx_test_monitor_1_1_0_alpha3_aar.xml +0 -11
  76. package/android/.idea/libraries/Gradle__androidx_test_monitor_1_3_0_aar.xml +0 -11
  77. package/android/.idea/libraries/Gradle__androidx_test_runner_1_1_0_alpha3_aar.xml +0 -11
  78. package/android/.idea/libraries/Gradle__androidx_test_runner_1_3_0_aar.xml +0 -11
  79. package/android/.idea/libraries/Gradle__androidx_tracing_tracing_1_0_0_aar.xml +0 -11
  80. package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml +0 -11
  81. package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml +0 -11
  82. package/android/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml +0 -11
  83. package/android/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml +0 -11
  84. package/android/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml +0 -11
  85. package/android/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1.xml +0 -9
  86. package/android/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml +0 -9
  87. package/android/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml +0 -9
  88. package/android/.idea/libraries/Gradle__junit_junit_4_12.xml +0 -9
  89. package/android/.idea/libraries/Gradle__junit_junit_4_13_1.xml +0 -9
  90. package/android/.idea/libraries/Gradle__net_bytebuddy_byte_buddy_1_10_18.xml +0 -9
  91. package/android/.idea/libraries/Gradle__net_bytebuddy_byte_buddy_agent_1_10_18.xml +0 -9
  92. package/android/.idea/libraries/Gradle__net_sf_kxml_kxml2_2_3_0.xml +0 -9
  93. package/android/.idea/libraries/Gradle__org_apache_cordova_framework_7_0_0_aar.xml +0 -11
  94. package/android/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml +0 -9
  95. package/android/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml +0 -9
  96. package/android/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml +0 -9
  97. package/android/.idea/libraries/Gradle__org_json_json_20140107.xml +0 -9
  98. package/android/.idea/libraries/Gradle__org_mockito_mockito_core_3_6_28.xml +0 -9
  99. package/android/.idea/libraries/Gradle__org_mockito_mockito_inline_3_6_28.xml +0 -9
  100. package/android/.idea/libraries/Gradle__org_objenesis_objenesis_3_1.xml +0 -9
  101. package/android/.idea/misc.xml +0 -9
  102. package/android/.idea/modules/1419750366/android.capacitor-android.iml +0 -92
  103. package/android/.idea/modules/android.iml +0 -87
  104. package/android/.idea/modules.xml +0 -9
  105. package/android/.idea/vcs.xml +0 -6
@@ -11,372 +11,376 @@ import android.view.SurfaceHolder;
11
11
  import android.view.TextureView;
12
12
  import android.view.View;
13
13
  import android.widget.RelativeLayout;
14
-
15
14
  import java.io.IOException;
16
15
  import java.util.List;
17
16
 
18
- class Preview extends RelativeLayout implements SurfaceHolder.Callback,
19
- TextureView.SurfaceTextureListener {
20
- private final String TAG = "Preview";
21
-
22
- CustomSurfaceView mSurfaceView;
23
- CustomTextureView mTextureView;
24
- SurfaceHolder mHolder;
25
- SurfaceTexture mSurface;
26
- Camera.Size mPreviewSize;
27
- List<Camera.Size> mSupportedPreviewSizes;
28
- Camera mCamera;
29
- int cameraId;
30
- int displayOrientation;
31
- int facing = Camera.CameraInfo.CAMERA_FACING_BACK;
32
- int viewWidth;
33
- int viewHeight;
34
- private boolean enableOpacity = false;
35
- private float opacity = 1F;
36
-
37
- Preview(Context context) {
38
- this(context, false);
39
- }
40
-
41
- Preview(Context context, boolean enableOpacity) {
42
- super(context);
43
-
44
- this.enableOpacity = enableOpacity;
45
- if (!enableOpacity) {
46
- mSurfaceView = new CustomSurfaceView(context);
47
- addView(mSurfaceView);
48
- requestLayout();
49
-
50
- // Install a SurfaceHolder.Callback so we get notified when the
51
- // underlying surface is created and destroyed.
52
- mHolder = mSurfaceView.getHolder();
53
- mHolder.addCallback(this);
54
- mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
55
- } else {
56
- // Use a TextureView so we can manage opacity
57
- mTextureView = new CustomTextureView(context);
58
- // Install a SurfaceTextureListener so we get notified
59
- mTextureView.setSurfaceTextureListener(this);
60
- mTextureView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
61
- addView(mTextureView);
62
- requestLayout();
63
- }
64
- }
65
-
66
- public void setCamera(Camera camera, int cameraId) {
67
- if (camera != null) {
68
- mCamera = camera;
69
- this.cameraId = cameraId;
70
- mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
71
- setCameraDisplayOrientation();
72
-
73
- List<String> mFocusModes = mCamera.getParameters().getSupportedFocusModes();
74
-
75
- Camera.Parameters params = mCamera.getParameters();
76
- if (mFocusModes.contains("continuous-picture")) {
77
- params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
78
- } else if (mFocusModes.contains("continuous-video")){
79
- params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
80
- } else if (mFocusModes.contains("auto")){
81
- params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
82
- }
83
- mCamera.setParameters(params);
17
+ class Preview extends RelativeLayout implements SurfaceHolder.Callback, TextureView.SurfaceTextureListener {
18
+
19
+ private final String TAG = "Preview";
20
+
21
+ CustomSurfaceView mSurfaceView;
22
+ CustomTextureView mTextureView;
23
+ SurfaceHolder mHolder;
24
+ SurfaceTexture mSurface;
25
+ Camera.Size mPreviewSize;
26
+ List<Camera.Size> mSupportedPreviewSizes;
27
+ Camera mCamera;
28
+ int cameraId;
29
+ int displayOrientation;
30
+ int facing = Camera.CameraInfo.CAMERA_FACING_BACK;
31
+ int viewWidth;
32
+ int viewHeight;
33
+ private boolean enableOpacity = false;
34
+ private float opacity = 1F;
35
+
36
+ Preview(Context context) {
37
+ this(context, false);
84
38
  }
85
- }
86
-
87
- public int getDisplayOrientation() {
88
- return displayOrientation;
89
- }
90
- public int getCameraFacing() {
91
- return facing;
92
- }
93
-
94
- public void printPreviewSize(String from) {
95
- Log.d(TAG, "printPreviewSize from " + from + ": > width: " + mPreviewSize.width + " height: " + mPreviewSize.height);
96
- }
97
- public void setCameraPreviewSize() {
98
- if (mCamera != null) {
99
- Camera.Parameters parameters = mCamera.getParameters();
100
- parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
101
- mCamera.setParameters(parameters);
39
+
40
+ Preview(Context context, boolean enableOpacity) {
41
+ super(context);
42
+ this.enableOpacity = enableOpacity;
43
+ if (!enableOpacity) {
44
+ mSurfaceView = new CustomSurfaceView(context);
45
+ addView(mSurfaceView);
46
+ requestLayout();
47
+
48
+ // Install a SurfaceHolder.Callback so we get notified when the
49
+ // underlying surface is created and destroyed.
50
+ mHolder = mSurfaceView.getHolder();
51
+ mHolder.addCallback(this);
52
+ mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
53
+ } else {
54
+ // Use a TextureView so we can manage opacity
55
+ mTextureView = new CustomTextureView(context);
56
+ // Install a SurfaceTextureListener so we get notified
57
+ mTextureView.setSurfaceTextureListener(this);
58
+ mTextureView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
59
+ addView(mTextureView);
60
+ requestLayout();
61
+ }
102
62
  }
103
- }
104
- private void setCameraDisplayOrientation() {
105
- Camera.CameraInfo info = new Camera.CameraInfo();
106
- int rotation = ((Activity) getContext()).getWindowManager().getDefaultDisplay().getRotation();
107
- int degrees = 0;
108
- DisplayMetrics dm = new DisplayMetrics();
109
-
110
- Camera.getCameraInfo(cameraId, info);
111
- ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(dm);
112
-
113
- switch (rotation) {
114
- case Surface.ROTATION_0:
115
- degrees = 0;
116
- break;
117
- case Surface.ROTATION_90:
118
- degrees = 90;
119
- break;
120
- case Surface.ROTATION_180:
121
- degrees = 180;
122
- break;
123
- case Surface.ROTATION_270:
124
- degrees = 270;
125
- break;
63
+
64
+ public void setCamera(Camera camera, int cameraId) {
65
+ if (camera != null) {
66
+ mCamera = camera;
67
+ this.cameraId = cameraId;
68
+ mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
69
+ setCameraDisplayOrientation();
70
+
71
+ List<String> mFocusModes = mCamera.getParameters().getSupportedFocusModes();
72
+
73
+ Camera.Parameters params = mCamera.getParameters();
74
+ if (mFocusModes.contains("continuous-picture")) {
75
+ params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
76
+ } else if (mFocusModes.contains("continuous-video")) {
77
+ params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
78
+ } else if (mFocusModes.contains("auto")) {
79
+ params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
80
+ }
81
+ mCamera.setParameters(params);
82
+ }
126
83
  }
127
- facing = info.facing;
128
- if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
129
- displayOrientation = (info.orientation + degrees) % 360;
130
- displayOrientation = (360 - displayOrientation) % 360;
131
- } else {
132
- displayOrientation = (info.orientation - degrees + 360) % 360;
84
+
85
+ public int getDisplayOrientation() {
86
+ return displayOrientation;
133
87
  }
134
88
 
135
- Log.d(TAG, "screen is rotated " + degrees + "deg from natural");
136
- Log.d(TAG, (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT ? "front" : "back") + " camera is oriented -" + info.orientation + "deg from natural");
137
- Log.d(TAG, "need to rotate preview " + displayOrientation + "deg");
138
- mCamera.setDisplayOrientation(displayOrientation);
139
- }
89
+ public int getCameraFacing() {
90
+ return facing;
91
+ }
140
92
 
141
- public void switchCamera(Camera camera, int cameraId) {
142
- try {
143
- setCamera(camera, cameraId);
93
+ public void printPreviewSize(String from) {
94
+ Log.d(TAG, "printPreviewSize from " + from + ": > width: " + mPreviewSize.width + " height: " + mPreviewSize.height);
95
+ }
144
96
 
145
- Log.d("CameraPreview", "before set camera");
97
+ public void setCameraPreviewSize() {
98
+ if (mCamera != null) {
99
+ Camera.Parameters parameters = mCamera.getParameters();
100
+ parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
101
+ mCamera.setParameters(parameters);
102
+ }
103
+ }
146
104
 
147
- View v;
148
- if (enableOpacity) {
149
- camera.setPreviewTexture(mSurface);
150
- v = mTextureView;
151
- } else {
152
- camera.setPreviewDisplay(mHolder);
153
- v = mSurfaceView;
154
- }
105
+ private void setCameraDisplayOrientation() {
106
+ Camera.CameraInfo info = new Camera.CameraInfo();
107
+ int rotation = ((Activity) getContext()).getWindowManager().getDefaultDisplay().getRotation();
108
+ int degrees = 0;
109
+ DisplayMetrics dm = new DisplayMetrics();
110
+
111
+ Camera.getCameraInfo(cameraId, info);
112
+ ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(dm);
113
+
114
+ switch (rotation) {
115
+ case Surface.ROTATION_0:
116
+ degrees = 0;
117
+ break;
118
+ case Surface.ROTATION_90:
119
+ degrees = 90;
120
+ break;
121
+ case Surface.ROTATION_180:
122
+ degrees = 180;
123
+ break;
124
+ case Surface.ROTATION_270:
125
+ degrees = 270;
126
+ break;
127
+ }
128
+ facing = info.facing;
129
+ if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
130
+ displayOrientation = (info.orientation + degrees) % 360;
131
+ displayOrientation = (360 - displayOrientation) % 360;
132
+ } else {
133
+ displayOrientation = (info.orientation - degrees + 360) % 360;
134
+ }
155
135
 
156
- Log.d("CameraPreview", "before getParameters");
136
+ Log.d(TAG, "screen is rotated " + degrees + "deg from natural");
137
+ Log.d(
138
+ TAG,
139
+ (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT ? "front" : "back") +
140
+ " camera is oriented -" +
141
+ info.orientation +
142
+ "deg from natural"
143
+ );
144
+ Log.d(TAG, "need to rotate preview " + displayOrientation + "deg");
145
+ mCamera.setDisplayOrientation(displayOrientation);
146
+ }
157
147
 
158
- Camera.Parameters parameters = camera.getParameters();
148
+ public void switchCamera(Camera camera, int cameraId) {
149
+ try {
150
+ setCamera(camera, cameraId);
159
151
 
160
- Log.d("CameraPreview", "before setPreviewSize");
152
+ Log.d("CameraPreview", "before set camera");
161
153
 
162
- mSupportedPreviewSizes = parameters.getSupportedPreviewSizes();
163
- mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, v.getWidth(), v.getHeight());
164
- parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
165
- Log.d(TAG, mPreviewSize.width + " " + mPreviewSize.height);
154
+ View v;
155
+ if (enableOpacity) {
156
+ camera.setPreviewTexture(mSurface);
157
+ v = mTextureView;
158
+ } else {
159
+ camera.setPreviewDisplay(mHolder);
160
+ v = mSurfaceView;
161
+ }
166
162
 
167
- camera.setParameters(parameters);
168
- } catch (IOException exception) {
169
- Log.e(TAG, exception.getMessage());
170
- }
171
- }
172
-
173
- @Override
174
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
175
- // We purposely disregard child measurements because act as a
176
- // wrapper to a SurfaceView that centers the camera preview instead
177
- // of stretching it.
178
- final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
179
- final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
180
- setMeasuredDimension(width, height);
181
-
182
- if (mSupportedPreviewSizes != null) {
183
- mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
184
- }
185
- }
163
+ Log.d("CameraPreview", "before getParameters");
186
164
 
187
- @Override
188
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
165
+ Camera.Parameters parameters = camera.getParameters();
189
166
 
190
- if (changed && getChildCount() > 0) {
191
- final View child = getChildAt(0);
167
+ Log.d("CameraPreview", "before setPreviewSize");
192
168
 
193
- int width = r - l;
194
- int height = b - t;
169
+ mSupportedPreviewSizes = parameters.getSupportedPreviewSizes();
170
+ mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, v.getWidth(), v.getHeight());
171
+ parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
172
+ Log.d(TAG, mPreviewSize.width + " " + mPreviewSize.height);
195
173
 
196
- int previewWidth = width;
197
- int previewHeight = height;
174
+ camera.setParameters(parameters);
175
+ } catch (IOException exception) {
176
+ Log.e(TAG, exception.getMessage());
177
+ }
178
+ }
198
179
 
199
- if (mPreviewSize != null) {
200
- previewWidth = mPreviewSize.width;
201
- previewHeight = mPreviewSize.height;
180
+ @Override
181
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
182
+ // We purposely disregard child measurements because act as a
183
+ // wrapper to a SurfaceView that centers the camera preview instead
184
+ // of stretching it.
185
+ final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
186
+ final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
187
+ setMeasuredDimension(width, height);
202
188
 
203
- if(displayOrientation == 90 || displayOrientation == 270) {
204
- previewWidth = mPreviewSize.height;
205
- previewHeight = mPreviewSize.width;
189
+ if (mSupportedPreviewSizes != null) {
190
+ mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
206
191
  }
207
-
208
- // LOG.d(TAG, "previewWidth:" + previewWidth + " previewHeight:" + previewHeight);
209
- }
210
-
211
- int nW;
212
- int nH;
213
- int top;
214
- int left;
215
-
216
- float scale = 1.0f;
217
-
218
- // Center the child SurfaceView within the parent.
219
- if (width * previewHeight < height * previewWidth) {
220
- Log.d(TAG, "center horizontally");
221
- int scaledChildWidth = (int)((previewWidth * height / previewHeight) * scale);
222
- nW = (width + scaledChildWidth) / 2;
223
- nH = (int)(height * scale);
224
- top = 0;
225
- left = (width - scaledChildWidth) / 2;
226
- } else {
227
- Log.d(TAG, "center vertically");
228
- int scaledChildHeight = (int) ((previewHeight * width / previewWidth) * scale);
229
- nW = (int) (width * scale);
230
- nH = (height + scaledChildHeight) / 2;
231
- top = (height - scaledChildHeight) / 2;
232
- left = 0;
233
- }
234
- child.layout(left, top, nW, nH);
235
-
236
- Log.d("layout", "left:" + left);
237
- Log.d("layout", "top:" + top);
238
- Log.d("layout", "right:" + nW);
239
- Log.d("layout", "bottom:" + nH);
240
- }
241
- }
242
-
243
- public void surfaceCreated(SurfaceHolder holder) {
244
- // The Surface has been created, acquire the camera and tell it where
245
- // to draw.
246
- try {
247
- if (mCamera != null) {
248
- mSurfaceView.setWillNotDraw(false);
249
- mCamera.setPreviewDisplay(holder);
250
- }
251
- } catch (Exception exception) {
252
- Log.e(TAG, "Exception caused by setPreviewDisplay()", exception);
253
192
  }
254
- }
255
-
256
- public void surfaceDestroyed(SurfaceHolder holder) {
257
- // Surface will be destroyed when we return, so stop the preview.
258
- try {
259
- if (mCamera != null) {
260
- mCamera.stopPreview();
261
- }
262
- } catch (Exception exception) {
263
- Log.e(TAG, "Exception caused by surfaceDestroyed()", exception);
193
+
194
+ @Override
195
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
196
+ if (changed && getChildCount() > 0) {
197
+ final View child = getChildAt(0);
198
+
199
+ int width = r - l;
200
+ int height = b - t;
201
+
202
+ int previewWidth = width;
203
+ int previewHeight = height;
204
+
205
+ if (mPreviewSize != null) {
206
+ previewWidth = mPreviewSize.width;
207
+ previewHeight = mPreviewSize.height;
208
+
209
+ if (displayOrientation == 90 || displayOrientation == 270) {
210
+ previewWidth = mPreviewSize.height;
211
+ previewHeight = mPreviewSize.width;
212
+ }
213
+ // LOG.d(TAG, "previewWidth:" + previewWidth + " previewHeight:" + previewHeight);
214
+ }
215
+
216
+ int nW;
217
+ int nH;
218
+ int top;
219
+ int left;
220
+
221
+ float scale = 1.0f;
222
+
223
+ // Center the child SurfaceView within the parent.
224
+ if (width * previewHeight < height * previewWidth) {
225
+ Log.d(TAG, "center horizontally");
226
+ int scaledChildWidth = (int) ((previewWidth * height / previewHeight) * scale);
227
+ nW = (width + scaledChildWidth) / 2;
228
+ nH = (int) (height * scale);
229
+ top = 0;
230
+ left = (width - scaledChildWidth) / 2;
231
+ } else {
232
+ Log.d(TAG, "center vertically");
233
+ int scaledChildHeight = (int) ((previewHeight * width / previewWidth) * scale);
234
+ nW = (int) (width * scale);
235
+ nH = (height + scaledChildHeight) / 2;
236
+ top = (height - scaledChildHeight) / 2;
237
+ left = 0;
238
+ }
239
+ child.layout(left, top, nW, nH);
240
+
241
+ Log.d("layout", "left:" + left);
242
+ Log.d("layout", "top:" + top);
243
+ Log.d("layout", "right:" + nW);
244
+ Log.d("layout", "bottom:" + nH);
245
+ }
264
246
  }
265
- }
266
- private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
267
- final double ASPECT_TOLERANCE = 0.1;
268
- double targetRatio = (double) w / h;
269
- if (displayOrientation == 90 || displayOrientation == 270) {
270
- targetRatio = (double) h / w;
247
+
248
+ public void surfaceCreated(SurfaceHolder holder) {
249
+ // The Surface has been created, acquire the camera and tell it where
250
+ // to draw.
251
+ try {
252
+ if (mCamera != null) {
253
+ mSurfaceView.setWillNotDraw(false);
254
+ mCamera.setPreviewDisplay(holder);
255
+ }
256
+ } catch (Exception exception) {
257
+ Log.e(TAG, "Exception caused by setPreviewDisplay()", exception);
258
+ }
271
259
  }
272
260
 
273
- if(sizes == null){
274
- return null;
261
+ public void surfaceDestroyed(SurfaceHolder holder) {
262
+ // Surface will be destroyed when we return, so stop the preview.
263
+ try {
264
+ if (mCamera != null) {
265
+ mCamera.stopPreview();
266
+ }
267
+ } catch (Exception exception) {
268
+ Log.e(TAG, "Exception caused by surfaceDestroyed()", exception);
269
+ }
275
270
  }
276
271
 
277
- Camera.Size optimalSize = null;
278
- double minDiff = Double.MAX_VALUE;
272
+ private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
273
+ final double ASPECT_TOLERANCE = 0.1;
274
+ double targetRatio = (double) w / h;
275
+ if (displayOrientation == 90 || displayOrientation == 270) {
276
+ targetRatio = (double) h / w;
277
+ }
279
278
 
280
- int targetHeight = h;
279
+ if (sizes == null) {
280
+ return null;
281
+ }
282
+
283
+ Camera.Size optimalSize = null;
284
+ double minDiff = Double.MAX_VALUE;
285
+
286
+ int targetHeight = h;
287
+
288
+ // Try to find an size match aspect ratio and size
289
+ for (Camera.Size size : sizes) {
290
+ double ratio = (double) size.width / size.height;
291
+ if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
292
+ if (Math.abs(size.height - targetHeight) < minDiff) {
293
+ optimalSize = size;
294
+ minDiff = Math.abs(size.height - targetHeight);
295
+ }
296
+ }
281
297
 
282
- // Try to find an size match aspect ratio and size
283
- for (Camera.Size size : sizes) {
284
- double ratio = (double) size.width / size.height;
285
- if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
286
- if (Math.abs(size.height - targetHeight) < minDiff) {
287
- optimalSize = size;
288
- minDiff = Math.abs(size.height - targetHeight);
289
- }
298
+ // Cannot find the one match the aspect ratio, ignore the requirement
299
+ if (optimalSize == null) {
300
+ minDiff = Double.MAX_VALUE;
301
+ for (Camera.Size size : sizes) {
302
+ if (Math.abs(size.height - targetHeight) < minDiff) {
303
+ optimalSize = size;
304
+ minDiff = Math.abs(size.height - targetHeight);
305
+ }
306
+ }
307
+ }
308
+
309
+ Log.d(TAG, "optimal preview size: w: " + optimalSize.width + " h: " + optimalSize.height);
310
+ return optimalSize;
290
311
  }
291
312
 
292
- // Cannot find the one match the aspect ratio, ignore the requirement
293
- if (optimalSize == null) {
294
- minDiff = Double.MAX_VALUE;
295
- for (Camera.Size size : sizes) {
296
- if (Math.abs(size.height - targetHeight) < minDiff) {
297
- optimalSize = size;
298
- minDiff = Math.abs(size.height - targetHeight);
313
+ public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
314
+ if (mCamera != null) {
315
+ try {
316
+ // Now that the size is known, set up the camera parameters and begin
317
+ // the preview.
318
+ mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
319
+ if (mSupportedPreviewSizes != null) {
320
+ mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, w, h);
321
+ }
322
+ startCamera();
323
+ } catch (Exception exception) {
324
+ Log.e(TAG, "Exception caused by surfaceChanged()", exception);
325
+ }
299
326
  }
300
- }
301
327
  }
302
328
 
303
- Log.d(TAG, "optimal preview size: w: " + optimalSize.width + " h: " + optimalSize.height);
304
- return optimalSize;
305
- }
329
+ private void startCamera() {
330
+ Camera.Parameters parameters = mCamera.getParameters();
331
+ parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
332
+ requestLayout();
333
+ //mCamera.setDisplayOrientation(90);
334
+ mCamera.setParameters(parameters);
335
+ mCamera.startPreview();
336
+ }
306
337
 
307
- public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
308
- if(mCamera != null) {
309
- try {
310
- // Now that the size is known, set up the camera parameters and begin
311
- // the preview.
312
- mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
313
- if (mSupportedPreviewSizes != null) {
314
- mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, w, h);
338
+ // Texture Callbacks
339
+
340
+ public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
341
+ // The Surface has been created, acquire the camera and tell it where
342
+ // to draw.
343
+ try {
344
+ mSurface = surface;
345
+ if (mSupportedPreviewSizes != null) {
346
+ mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
347
+ }
348
+ if (mCamera != null) {
349
+ mTextureView.setAlpha(opacity);
350
+ mCamera.setPreviewTexture(surface);
351
+ startCamera();
352
+ }
353
+ } catch (Exception exception) {
354
+ Log.e(TAG, "Exception caused by onSurfaceTextureAvailable()", exception);
315
355
  }
316
- startCamera();
317
- } catch (Exception exception) {
318
- Log.e(TAG, "Exception caused by surfaceChanged()", exception);
319
- }
320
- }
321
- }
322
-
323
- private void startCamera() {
324
- Camera.Parameters parameters = mCamera.getParameters();
325
- parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
326
- requestLayout();
327
- //mCamera.setDisplayOrientation(90);
328
- mCamera.setParameters(parameters);
329
- mCamera.startPreview();
330
- }
331
-
332
- // Texture Callbacks
333
-
334
- public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
335
- // The Surface has been created, acquire the camera and tell it where
336
- // to draw.
337
- try {
338
- mSurface = surface;
339
- if (mSupportedPreviewSizes != null) {
340
- mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
341
- }
342
- if (mCamera != null) {
343
- mTextureView.setAlpha(opacity);
344
- mCamera.setPreviewTexture(surface);
345
- startCamera();
346
- }
347
- } catch (Exception exception) {
348
- Log.e(TAG, "Exception caused by onSurfaceTextureAvailable()", exception);
349
356
  }
350
- }
351
-
352
- public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
353
- }
354
-
355
- public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
356
- try {
357
- if (mCamera != null) {
358
- mCamera.stopPreview();
359
- }
360
- } catch (Exception exception) {
361
- Log.e(TAG, "Exception caused by onSurfaceTextureDestroyed()", exception);
362
- return false;
357
+
358
+ public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}
359
+
360
+ public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
361
+ try {
362
+ if (mCamera != null) {
363
+ mCamera.stopPreview();
364
+ }
365
+ } catch (Exception exception) {
366
+ Log.e(TAG, "Exception caused by onSurfaceTextureDestroyed()", exception);
367
+ return false;
368
+ }
369
+ return true;
363
370
  }
364
- return true;
365
371
 
366
- }
372
+ public void onSurfaceTextureUpdated(SurfaceTexture surface) {}
367
373
 
368
- public void onSurfaceTextureUpdated(SurfaceTexture surface) {
369
- }
370
- public void setOneShotPreviewCallback(Camera.PreviewCallback callback) {
371
- if(mCamera != null) {
372
- mCamera.setOneShotPreviewCallback(callback);
374
+ public void setOneShotPreviewCallback(Camera.PreviewCallback callback) {
375
+ if (mCamera != null) {
376
+ mCamera.setOneShotPreviewCallback(callback);
377
+ }
373
378
  }
374
- }
375
379
 
376
- public void setOpacity(final float opacity) {
377
- this.opacity = opacity;
378
- if (mCamera != null && enableOpacity) {
379
- mTextureView.setAlpha(opacity);
380
+ public void setOpacity(final float opacity) {
381
+ this.opacity = opacity;
382
+ if (mCamera != null && enableOpacity) {
383
+ mTextureView.setAlpha(opacity);
384
+ }
380
385
  }
381
- }
382
386
  }