You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio Java车牌扫描应用问题:回调未识别及启动失败

解决Android相机车牌识别应用的启动错误与相机回调问题

一、解决「Default Activity not found」启动错误

该错误是因为AndroidManifest.xml未正确配置默认启动Activity,按以下步骤修复:

  • 打开AndroidManifest.xml,找到main_camsacnner的Activity标签,添加启动意图过滤器,API31+需设置exported="true":
<activity
    android:name=".main_camsacnner"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
  • 检查Activity类名拼写是否与代码中完全一致。

二、解决TakePicture/PictureCallback未识别与相机初始化问题

原代码存在mCamera未初始化、未实现SurfaceHolder.Callback核心方法的问题,导致相机无法正常工作:

1. 实现SurfaceHolder.Callback接口

让Activity实现SurfaceHolder.Callback,通过三个方法管理相机生命周期:

public class main_camsacnner extends AppCompatActivity implements SurfaceHolder.Callback {
    private Camera mCamera;
    private SurfaceView mPreview;
    private Button mCaptureButton;
    private TextView mResultTextView;
    private TextRecognizer mTextRecognizer;

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 初始化后置相机
        try {
            mCamera = Camera.open();
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(this, "相机初始化失败", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // 预览尺寸变更时重置相机
        if (mCamera == null) return;
        mCamera.stopPreview();
        try {
            Camera.Parameters params = mCamera.getParameters();
            // 可根据需求设置预览尺寸、对焦模式等参数
            mCamera.setParameters(params);
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // 释放相机资源
        if (mCamera != null) {
            mCamera.stopPreview();
            mCamera.release();
            mCamera = null;
        }
    }

    // 原有onCreate等方法...
}

修改onCreate中的回调注册代码:

// 移除强制类型转换,直接传入this
mPreview.getHolder().addCallback(this);

2. 避免空指针调用

确保mCamera初始化完成后再调用takePicture,原代码中点击事件无需修改,但需保证相机初始化成功。

三、完善车牌识别与结果展示

原代码未将识别结果写入TextView,且未过滤车牌格式,补充以下修改:

1. 在回调中更新UI并提取车牌

修改mPictureCallback的onPictureTaken方法:

private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
        Frame frame = new Frame.Builder().setBitmap(bitmap).build();
        SparseArray<TextBlock> textBlocks = mTextRecognizer.detect(frame);
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < textBlocks.size(); i++) {
            TextBlock textBlock = textBlocks.valueAt(i);
            stringBuilder.append(textBlock.getValue()).append("\n");
        }
        // 在主线程更新TextView
        runOnUiThread(() -> {
            String plateNumber = extractPlateNumber(stringBuilder.toString());
            mResultTextView.setText(plateNumber.isEmpty() ? "未识别到车牌" : "识别结果:" + plateNumber);
        });
        // 拍照后恢复预览
        camera.startPreview();
    }
};

// 添加车牌格式提取方法(匹配国内常见车牌)
private String extractPlateNumber(String text) {
    String regex = "[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    return matcher.find() ? matcher.group() : "";
}

2. 添加权限申请

API23+需动态申请相机权限,在onCreate中添加检查:

private static final int REQUEST_CAMERA_PERMISSION = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_camsacnner);

    // 检查并申请相机权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
    }

    // 原有初始化代码...
}

// 处理权限申请结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CAMERA_PERMISSION) {
        if (grantResults.length == 0 || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "需要相机权限才能使用功能", Toast.LENGTH_SHORT).show();
            finish();
        }
    }
}

同时在AndroidManifest.xml中添加权限声明:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

四、其他注意事项

  • android.hardware.Camera是旧API,API21+建议迁移到camera2框架以获得更好的兼容性和功能;
  • 确保设备安装Google Play Services,否则TextRecognizer无法正常工作;
  • 拍照后的图片可能因相机方向倒置,可添加图片旋转逻辑优化识别准确性。

内容的提问来源于stack exchange,提问作者Al Rv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:43:19