11package com .example .proscan .scanner .impl ;
22
3+ import android .annotation .SuppressLint ;
34import android .app .Activity ;
45import android .content .Context ;
56import android .content .Intent ;
1112import androidx .annotation .NonNull ;
1213import androidx .appcompat .app .AppCompatActivity ;
1314import androidx .camera .core .Camera ;
15+ import androidx .camera .core .CameraControl ;
1416import androidx .camera .core .CameraSelector ;
17+ import androidx .camera .core .FocusMeteringAction ;
1518import androidx .camera .core .ImageAnalysis ;
1619import androidx .camera .core .ImageProxy ;
20+ import androidx .camera .core .MeteringPoint ;
21+ import androidx .camera .core .MeteringPointFactory ;
1722import androidx .camera .core .Preview ;
1823import androidx .camera .lifecycle .ProcessCameraProvider ;
1924import androidx .camera .view .PreviewView ;
2227
2328import com .example .proscan .R ;
2429import com .example .proscan .scanner .BarcodeScanner ;
30+ import com .example .proscan .view .ViewfinderView ;
2531import com .google .common .util .concurrent .ListenableFuture ;
2632import com .google .mlkit .vision .barcode .BarcodeScanning ;
2733import com .google .mlkit .vision .barcode .common .Barcode ;
@@ -66,6 +72,7 @@ public boolean isAvailable(Activity activity) {
6672 */
6773 public static class MlKitScanActivity extends AppCompatActivity {
6874 private PreviewView previewView ;
75+ private ViewfinderView viewfinderView ;
6976 private TextView scanText ;
7077 private ProcessCameraProvider cameraProvider ;
7178 private ExecutorService cameraExecutor ;
@@ -82,7 +89,7 @@ protected void onCreate(Bundle savedInstanceState) {
8289 setContentView (R .layout .activity_mlkit_scan );
8390
8491 previewView = findViewById (R .id .preview_view );
85- // scanFrame 已被自定义 View 替代,不再需要手动查找
92+ viewfinderView = findViewById ( R . id . viewfinder_view );
8693 scanText = findViewById (R .id .scan_text );
8794
8895 cameraExecutor = Executors .newSingleThreadExecutor ();
@@ -139,6 +146,15 @@ private void bindCameraUseCases(ProcessCameraProvider provider) {
139146 preview ,
140147 imageAnalysis
141148 );
149+
150+ // 确保启用连续自动对焦 (Continuous Auto Focus)
151+ // 取消任何现有的焦点锁定,恢复到自动对焦模式
152+ CameraControl cameraControl = camera .getCameraControl ();
153+ cameraControl .cancelFocusAndMetering ();
154+
155+ // 设置点击对焦
156+ setupTapToFocus (cameraControl );
157+
142158 } catch (Exception e ) {
143159 if (currentCallback != null ) {
144160 currentCallback .onError ("相机绑定失败: " + e .getMessage ());
@@ -147,6 +163,27 @@ private void bindCameraUseCases(ProcessCameraProvider provider) {
147163 }
148164 }
149165
166+ private void setupTapToFocus (CameraControl cameraControl ) {
167+ if (viewfinderView != null ) {
168+ viewfinderView .setOnTouchListener ((v , event ) -> {
169+ if (event .getAction () == android .view .MotionEvent .ACTION_DOWN ) {
170+ MeteringPointFactory factory = previewView .getMeteringPointFactory ();
171+ MeteringPoint point = factory .createPoint (event .getX (), event .getY ());
172+
173+ // 创建对焦动作,设置自动取消时间(例如3秒后恢复自动对焦)
174+ FocusMeteringAction action = new FocusMeteringAction .Builder (point , FocusMeteringAction .FLAG_AF )
175+ .setAutoCancelDuration (3 , java .util .concurrent .TimeUnit .SECONDS )
176+ .build ();
177+
178+ cameraControl .startFocusAndMetering (action );
179+ v .performClick (); // 辅助功能支持
180+ return true ;
181+ }
182+ return false ;
183+ });
184+ }
185+ }
186+
150187 private class BarcodeAnalyzer implements ImageAnalysis .Analyzer {
151188 private com .google .mlkit .vision .barcode .BarcodeScanner scanner ;
152189 private boolean isScanning = true ; // 标记是否正在扫码
@@ -182,7 +219,7 @@ public void analyze(@NonNull ImageProxy image) {
182219 return ;
183220 }
184221
185- InputImage inputImage = InputImage .fromMediaImage (
222+ @ SuppressLint ( "UnsafeOptInUsageError" ) InputImage inputImage = InputImage .fromMediaImage (
186223 image .getImage (),
187224 image .getImageInfo ().getRotationDegrees ()
188225 );
0 commit comments