Skip to content

Commit 308cb2d

Browse files
author
Administrator
committed
bug修复-自动对焦
1 parent 15dc809 commit 308cb2d

File tree

3 files changed

+39
-2
lines changed

3 files changed

+39
-2
lines changed
-112 Bytes
Binary file not shown.
-124 Bytes
Binary file not shown.

app/src/main/java/com/example/proscan/scanner/impl/MlKitBarcodeScanner.java

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.example.proscan.scanner.impl;
22

3+
import android.annotation.SuppressLint;
34
import android.app.Activity;
45
import android.content.Context;
56
import android.content.Intent;
@@ -11,9 +12,13 @@
1112
import androidx.annotation.NonNull;
1213
import androidx.appcompat.app.AppCompatActivity;
1314
import androidx.camera.core.Camera;
15+
import androidx.camera.core.CameraControl;
1416
import androidx.camera.core.CameraSelector;
17+
import androidx.camera.core.FocusMeteringAction;
1518
import androidx.camera.core.ImageAnalysis;
1619
import androidx.camera.core.ImageProxy;
20+
import androidx.camera.core.MeteringPoint;
21+
import androidx.camera.core.MeteringPointFactory;
1722
import androidx.camera.core.Preview;
1823
import androidx.camera.lifecycle.ProcessCameraProvider;
1924
import androidx.camera.view.PreviewView;
@@ -22,6 +27,7 @@
2227

2328
import com.example.proscan.R;
2429
import com.example.proscan.scanner.BarcodeScanner;
30+
import com.example.proscan.view.ViewfinderView;
2531
import com.google.common.util.concurrent.ListenableFuture;
2632
import com.google.mlkit.vision.barcode.BarcodeScanning;
2733
import 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

Comments
 (0)