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

如何使用gozxing访问安卓手机摄像头实现条码扫描

在Fyne框架中集成摄像头与gozxing实现条码/二维码扫描

问题核心

你基于Fyne框架搭建了应用基础结构,找到了gozxing库用于条码解码,但缺少安卓摄像头的访问逻辑,无法实现实时扫描功能。

解决方案(Go方案,优先推荐)

Fyne官方提供了扩展摄像头组件,结合gozxing可快速完成扫描功能,步骤如下:

1. 依赖准备

安装所需的扩展库和解码库:

go get fyne.io/x/fyne/camera
go get github.com/makiuchi-d/gozxing

2. 安卓权限配置

编译安卓应用时必须添加摄像头权限,可通过Fyne打包命令指定:

fyne package -os android -appID com.your.app.id -permission android.permission.CAMERA

也可手动修改AndroidManifest.xml添加权限:

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

修改后的完整代码

package main

import (
	"image"
	"log"

	"github.com/makiuchi-d/gozxing"
	"github.com/makiuchi-d/gozxing/qrcode"
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/layout"
	"fyne.io/fyne/v2/theme"
	"fyne.io/fyne/v2/widget"
	"fyne.io/x/fyne/camera"
)

func makeUI(tabs *container.AppTabs) *fyne.Container {
	return container.New(layout.NewGridLayout(1), tabs)
}

// 创建扫描界面
func makeScanUI(resultEntry *widget.Entry) *fyne.Container {
	// 初始化摄像头预览组件
	cam := camera.NewWidget()
	resultEntry.SetPlaceHolder("扫描结果将显示在这里")

	// 监听摄像头帧数据,实时解码
	cam.OnFrame = func(img image.Image) {
		// 转换图像格式为gozxing可处理的类型
		bmp, err := gozxing.NewBinaryBitmapFromImage(img)
		if err != nil {
			return
		}

		// 初始化QR码解码器,如需支持普通条码,替换为MultiFormatReader
		reader := qrcode.NewQRCodeReader()
		result, err := reader.Decode(bmp, nil)
		if err != nil {
			return
		}

		// 更新UI(确保在主线程执行)
		resultEntry.SetText(result.GetText())
		// 可选:扫描到结果后停止摄像头
		// cam.Stop()
	}

	return container.New(layout.NewVBoxLayout(),
		cam,
		resultEntry,
		widget.NewButton("停止扫描", func() {
			cam.Stop()
		}),
	)
}

func main() {
	myApp := app.New()
	myWindow := myApp.NewWindow("Kütüphane")
	myWindow.Resize(fyne.NewSize(300, 400))

	input := widget.NewEntry()
	input.SetPlaceHolder("Kitap Numarasını Girin")

	tabs := container.NewAppTabs(
		container.NewTabItemWithIcon("Ana Sayfa", theme.HomeIcon(), container.NewVBox(widget.NewButton("Barkodu Okut", func() {
			scanWindow := myApp.NewWindow("Barkod Okuma")
			scanWindow.Resize(fyne.NewSize(400, 600))
			scanWindow.SetContent(makeScanUI(input))
			scanWindow.Show()
			log.Print("扫描窗口已打开")
		}))),
		container.NewTabItem("Ayarlar", container.NewVBox()),
		container.NewTabItem("Aktifler", container.NewVBox()),
	)
	tabs.SetTabLocation(container.TabLocationBottom)

	myWindow.SetContent(makeUI(tabs))
	myWindow.Show()
	myApp.Run()
}

代码关键说明

  • camera.NewWidget():跨平台摄像头预览组件,自动处理安卓/桌面平台的摄像头访问逻辑
  • cam.OnFrame:每帧图像的回调函数,在此完成条码解码
  • 解码扩展:如需支持普通条码,将qrcode.NewQRCodeReader()替换为gozxing.NewMultiFormatReader()

备选方案:C代码实现

若Go方案存在兼容性问题,可通过CGO调用C语言实现:

  • 用C调用安卓原生CameraX框架获取摄像头帧数据
  • 集成zbar等C语言条码库完成解码
  • 通过CGO将解码结果传递给Go层更新UI,注意配置安卓NDK交叉编译环境

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:08:11