android zbar使用

android zbar使用一 配置 ndk 这就不说了 网上一大堆 随便一搜就搞定了二 下载 zbar 源码 1 下载 Zbar libiconv 源码到 ZBar 的 Github 托管主页上下载 https github com ZBar ZBar 下载 libiconv http www gnu org software libiconv downloading2 编译 libiconv 编译 libiconv

根据zbar目录结构,对Android.mk进行改动,主要改的是文件夹路径和文件路径,修改后的Android.mk的内容如下:

MY_LOCAL_PATH := $(call my-dir) # libiconv include $(CLEAR_VARS) LOCAL_PATH := $(MY_LOCAL_PATH) LOCAL_MODULE := libiconv LOCAL_CFLAGS := \  -Wno-multichar \  -D_ANDROID \  -DLIBDIR="c" \  -DBUILDING_LIBICONV \  -DBUILDING_LIBCHARSET \  -DIN_LIBRARY LOCAL_SRC_FILES := \  libiconv-1.15/lib/iconv.c \  libiconv-1.15/libcharset/lib/localcharset.c \  libiconv-1.15/lib/relocatable.c LOCAL_C_INCLUDES := \  $(LOCAL_PATH)/libiconv-1.15/include \  $(LOCAL_PATH)/libiconv-1.15/libcharset \  $(LOCAL_PATH)/libiconv-1.15/libcharset/include include $(BUILD_SHARED_LIBRARY) LOCAL_LDLIBS := -llog -lcharset # libzbarjni include $(CLEAR_VARS) LOCAL_PATH := $(MY_LOCAL_PATH) LOCAL_MODULE := zbar LOCAL_SRC_FILES := zbarjni.c \  zbar/img_scanner.c \  zbar/decoder.c \  zbar/image.c \  zbar/symbol.c \  zbar/convert.c \  zbar/config.c \  zbar/scanner.c \  zbar/error.c \  zbar/refcnt.c \  zbar/video.c \  zbar/video/null.c \  zbar/decoder/code128.c \  zbar/decoder/code39.c \  zbar/decoder/code93.c \  zbar/decoder/codabar.c \  zbar/decoder/databar.c \  zbar/decoder/ean.c \  zbar/decoder/i25.c \  zbar/decoder/qr_finder.c \  zbar/qrcode/bch15_5.c \  zbar/qrcode/binarize.c \  zbar/qrcode/isaac.c \  zbar/qrcode/qrdec.c \  zbar/qrcode/qrdectxt.c \  zbar/qrcode/rs.c \  zbar/qrcode/util.c LOCAL_C_INCLUDES := \  $(LOCAL_PATH)/include \  $(LOCAL_PATH)/zbar \  $(LOCAL_PATH)/libiconv-1.15/include LOCAL_SHARED_LIBRARIES := libiconv include $(BUILD_SHARED_LIBRARY)

然后在Application.mk中填写你要编译的平台:

APP_ABI := armeabi armeabi-v7a x86 APP_PLATFORM := android-14

在app目录下build.gradle中添加

android { … … sourceSets { main { jni.srcDirs = [] } } repositories { flatDir { dirs 'libs' } } }

将解压后zbar/android/examples/CameraTest/res/layout /下的main.xml文件拷贝到主工程中res/layout下

在MainActivity中调用.so库和native方法:

public class MainActivity extends AppCompatActivity { 
    private Camera mCamera; private CameraPreview mPreview; private Handler autoFocusHandler; TextView scanText; Button scanButton; ImageScanner scanner; private boolean barcodeScanned = false; private boolean previewing = true; static { System.loadLibrary("iconv"); System.loadLibrary("zbar"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); /* Instance barcode scanner */ scanner = new ImageScanner(); scanner.setConfig(0, Config.X_DENSITY, 3); scanner.setConfig(0, Config.Y_DENSITY, 3); autoFocusHandler = new Handler(); mCamera = getCameraInstance(); mPreview = new CameraPreview(this, mCamera, previewCb, autoFocusCB); FrameLayout preview = (FrameLayout)findViewById(R.id.cameraPreview); preview.addView(mPreview); scanText = (TextView)findViewById(R.id.scanText); scanButton = (Button)findViewById(R.id.ScanButton); scanButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { if (barcodeScanned) { barcodeScanned = false; scanText.setText("Scanning..."); mCamera.setPreviewCallback(previewCb); mCamera.startPreview(); previewing = true; mCamera.autoFocus(autoFocusCB); } } }); } public void onPause() { super.onPause(); releaseCamera(); } / A safe way to get an instance of the Camera object. */ public static Camera getCameraInstance(){ Camera c = null; try { c = Camera.open(); } catch (Exception e){ } return c; } private void releaseCamera() { if (mCamera != null) { previewing = false; mCamera.setPreviewCallback(null); mCamera.release(); mCamera = null; } } private Runnable doAutoFocus = new Runnable() { public void run() { if (previewing) mCamera.autoFocus(autoFocusCB); } }; PreviewCallback previewCb = new PreviewCallback() { public void onPreviewFrame(byte[] data, Camera camera) { Camera.Parameters parameters = camera.getParameters(); Size size = parameters.getPreviewSize(); Image barcode = new Image(size.width, size.height, "Y800"); barcode.setData(data); String qrCodeString = null; ImageScanner mImageScanner = new ImageScanner(); int result = mImageScanner.scanImage(barcode); if (result != 0) { SymbolSet symSet = mImageScanner.getResults(); for (Symbol sym : symSet) qrCodeString = sym.getData(); } if (!TextUtils.isEmpty(qrCodeString)) { // 成功识别二维码,qrCodeString就是数据。  try { String encodeResust = new String(qrCodeString.getBytes("GB2312"), "utf-8"); Toast.makeText(MainActivity.this, encodeResust, Toast.LENGTH_SHORT).show(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } }; // Mimic continuous auto-focusing AutoFocusCallback autoFocusCB = new AutoFocusCallback() { public void onAutoFocus(boolean success, Camera camera) { autoFocusHandler.postDelayed(doAutoFocus, 1000); } }; }

Demo地址:https://github.com/LeeVanie/ZbarDemo

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222168.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:25
下一篇 2026年3月17日 下午4:25


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号