- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是 android 开发的新手。我的应用程序应激活相机以扫描二维码并将其解码为字符串。这很好用,但我还有一个要求:在一个框架中呈现相机 View ,并在其中一个角上带有 Logo 。我没有在zbar sdk中找到合适的API来制作框架和附加标志。这是我的代码:
ZBarScannerActivity.java:
package com.myCompany.android;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;
import net.sourceforge.zbar.Config;
import net.sourceforge.zbar.Image;
import net.sourceforge.zbar.ImageScanner;
import net.sourceforge.zbar.Symbol;
import net.sourceforge.zbar.SymbolSet;
public class ZBarScannerActivity extends Activity implements Camera.PreviewCallback, ZBarConstants {
private static final String TAG = "ZBarScannerActivity";
private CameraPreview mPreview;
private Camera mCamera;
private ImageScanner mScanner;
private Handler mAutoFocusHandler;
private boolean mPreviewing = true;
static {
System.loadLibrary("iconv");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Hide the window title.
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
mAutoFocusHandler = new Handler();
// Create and configure the ImageScanner;
setupScanner();
// Create a RelativeLayout container that will hold a SurfaceView,
// and set it as the content of our activity.
mPreview = new CameraPreview(this, this, autoFocusCB);
setContentView(mPreview);
}
public void setupScanner() {
mScanner = new ImageScanner();
mScanner.setConfig(0, Config.X_DENSITY, 3);
mScanner.setConfig(0, Config.Y_DENSITY, 3);
int[] symbols = getIntent().getIntArrayExtra(SCAN_MODES);
if (symbols != null) {
mScanner.setConfig(Symbol.NONE, Config.ENABLE, 0);
for (int symbol : symbols) {
mScanner.setConfig(symbol, Config.ENABLE, 1);
}
//test customization
}
}
@Override
protected void onResume() {
super.onResume();
// Open the default i.e. the first rear facing camera.
mCamera = Camera.open();
mPreviewing = true;
mPreview.setCamera(mCamera);
}
@Override
protected void onPause() {
super.onPause();
// Because the Camera object is a shared resource, it's very
// important to release it when the activity is paused.
if (mCamera != null) {
mPreview.setCamera(null);
mCamera.cancelAutoFocus();
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mPreviewing = false;
mCamera = null;
}
}
public void onPreviewFrame(byte[] data, Camera camera) {
Camera.Parameters parameters = camera.getParameters();
Camera.Size size = parameters.getPreviewSize();
Image barcode = new Image(size.width, size.height, "Y800");
barcode.setData(data);
int result = mScanner.scanImage(barcode);
if (result != 0) {
mCamera.cancelAutoFocus();
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mPreviewing = false;
SymbolSet syms = mScanner.getResults();
for (Symbol sym : syms) {
String symData = sym.getData();
if (!TextUtils.isEmpty(symData)) {
Intent dataIntent = new Intent();
dataIntent.putExtra(SCAN_RESULT, symData);
dataIntent.putExtra(SCAN_RESULT_TYPE, sym.getType());
setResult(Activity.RESULT_OK, dataIntent);
finish();
break;
}
}
}
}
private Runnable doAutoFocus = new Runnable() {
public void run() {
if(mCamera != null && mPreviewing) {
mCamera.autoFocus(autoFocusCB);
}
}
};
// Mimic continuous auto-focusing
Camera.AutoFocusCallback autoFocusCB = new Camera.AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
mAutoFocusHandler.postDelayed(doAutoFocus, 1000);
}
};
public void launchQRScanner(View v) {
if (isCameraAvailable()) {
//Toast.makeText(this, "Analyzing Image", Toast.LENGTH_LONG).show();
Intent intent = new Intent(this, ZBarScannerActivity.class);
intent.putExtra(ZBarConstants.SCAN_MODES, new int[]{Symbol.QRCODE});
startActivityForResult(intent, ZBAR_QR_SCANNER_REQUEST);
} else {
Toast.makeText(this, "Camera Unavailable", Toast.LENGTH_SHORT).show();
}
}
public boolean isCameraAvailable() {
PackageManager pm = getPackageManager();
return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
//getMenuInflater().inflate(R.menu.activity_qrimport_token, menu);
return true;
}
/* @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch (requestCode) {
case ZBAR_SCANNER_REQUEST:
Toast.makeText(this, data.getStringExtra(ZBarConstants.SCAN_RESULT), Toast.LENGTH_LONG).show();
break;
case ZBAR_QR_SCANNER_REQUEST:
playSound();
if (resultCode == RESULT_OK) {
Toast.makeText(this, data.getStringExtra(ZBarConstants.SCAN_RESULT), Toast.LENGTH_LONG).show();
Toast.makeText(this, "Scan Result = " + data.getStringExtra(ZBarConstants.SCAN_RESULT), Toast.LENGTH_SHORT).show();
// put whatever you want to do with the code here
//TextView tv = new TextView(this);
//tv.setText(data.getStringExtra(ZBarConstants.SCAN_RESULT));
Log.d("Data",""+data.getStringExtra(ZBarConstants.SCAN_RESULT));
//setContentView(tv);
}
break;
}
}*/
/*private void playSound()
{
MediaPlayer mp = MediaPlayer.create(getBaseContext(), R.raw.camera_shutter);
mp.start();
mp.setOnCompletionListener(new OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer mp)
{
mp.release();
}
});
}*/
}
CameraPreview.java:
package com.myCompany.android;
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera.Size;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import java.io.IOException;
import java.util.List;
class CameraPreview extends ViewGroup implements SurfaceHolder.Callback {
private final String TAG = "CameraPreview";
SurfaceView mSurfaceView;
SurfaceHolder mHolder;
Size mPreviewSize;
List<Size> mSupportedPreviewSizes;
Camera mCamera;
PreviewCallback mPreviewCallback;
AutoFocusCallback mAutoFocusCallback;
CameraPreview(Context context, PreviewCallback previewCallback, AutoFocusCallback autoFocusCb) {
super(context);
mPreviewCallback = previewCallback;
mAutoFocusCallback = autoFocusCb;
mSurfaceView = new SurfaceView(context);
addView(mSurfaceView);
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = mSurfaceView.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void setCamera(Camera camera) {
mCamera = camera;
if (mCamera != null) {
mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
requestLayout();
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// We purposely disregard child measurements because act as a
// wrapper to a SurfaceView that centers the camera preview instead
// of stretching it.
final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);
if (mSupportedPreviewSizes != null) {
mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
if (changed && getChildCount() > 0) {
final View child = getChildAt(0);
final int width = r - l;
final int height = b - t;
int previewWidth = width;
int previewHeight = height;
if (mPreviewSize != null) {
previewWidth = mPreviewSize.width;
previewHeight = mPreviewSize.height;
}
// Center the child SurfaceView within the parent.
if (width * previewHeight > height * previewWidth) {
final int scaledChildWidth = previewWidth * height / previewHeight;
child.layout((width - scaledChildWidth) / 2, 0,
(width + scaledChildWidth) / 2, height);
} else {
final int scaledChildHeight = previewHeight * width / previewWidth;
child.layout(0, (height - scaledChildHeight) / 2,
width, (height + scaledChildHeight) / 2);
}
}
}
public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, acquire the camera and tell it where
// to draw.
try {
if (mCamera != null) {
mCamera.setPreviewDisplay(holder);
}
} catch (IOException exception) {
Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
// Surface will be destroyed when we return, so stop the preview.
if (mCamera != null) {
mCamera.cancelAutoFocus();
mCamera.stopPreview();
}
}
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) w / h;
if (sizes == null) return null;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
// Try to find an size match aspect ratio and size
for (Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
// Cannot find the one match the aspect ratio, ignore the requirement
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if (holder.getSurface() == null){
// preview surface does not exist
return;
}
// Now that the size is known, set up the camera parameters and begin
// the preview.
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
requestLayout();
mCamera.setParameters(parameters);
mCamera.setPreviewCallback(mPreviewCallback);
mCamera.startPreview();
mCamera.autoFocus(mAutoFocusCallback);
}
}
如何为 android 自定义相机 View ?我看到了一些针对 iPhone 的建议解决方案,但适用于 Android 的 zbar API 完全不同,而且要小得多。如果能得到任何想法/提示,我将不胜感激......
最佳答案
要在 cameraview 中显示一个帧,请在 main.xml 的 framelayout(camerapreview) 中添加一个 imageview。
<FrameLayout
android:id="@+id/cameraPreview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:alpha="0.6"
android:src="@drawable/overlay" />
</FrameLayout>
使用此代码使框架( ImageView )可见。由于 frame(imageview) 已经存在于 main.xml 的 framelayout 中,我们需要先将其删除。
FrameLayout preview = (FrameLayout)findViewById(R.id.cameraPreview);
ImageView iv=(ImageView) findViewById(R.id.imageView1);
preview.addView(mPreview);
preview.removeView(iv);
preview.addView(iv);
要仅从您的帧中扫描相机预览,您需要使用 setCrop()。根据帧调整相机预览的大小。
barcode.setData(data);
//this is in portrait mode
//barcode.setCrop(left,top,width,height).
barcode.setCrop(100,230,600,10);
这对我有用,希望它也能解决您的问题。请原谅我的语法错误。谢谢。
关于android - 使用 zbar 为 Android 自定义相机 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16311693/
我正在尝试在我的计算机上安装 ZBar,从命令窗口(以管理员身份)运行 pip install zbar。但是,我不断收到以下错误: zbarmodule.c C:\Python27\include\
我最近一直在使用 pyzbar,因为 python 3 不支持 zbar。有没有办法检测二维码的位置(4 个角)?在 zbar 中很容易,其中 symbol.location() 将显示二维码四个角的
我正在使用 Zbar SDK,想要扫描我的定义框架中的 QRcode 和条形码,但它正在扫描屏幕的任何部分,而不是在我定义的框架中,所以我在哪里做错了? 我想在我定义的框架中进行这样的扫描。 http
我正在使用ZBAR进行二维码扫描。我已经正确实现了ZBar。现在,我想在Zbar中打开或关闭闪光灯。 在ZBar网站上,我仅获得有关Torch的信息,而未获得有关闪光灯的信息。 最佳答案 “闪光灯”是
在我的 ios 应用程序中,我已将 zbar qr sdk 代码扫描仪实现到我的应用程序中。用户扫描二维码,内容进入文本字段(不可编辑类型)。 我想知道,有没有一种方法可以让应用程序自动打开 safa
- (IBAction)scanProduct:(id)sender { // for scanning product ZBarReaderViewController *read
我只是用ZBar SDK扫码。我希望当扫描条形码时,它可以发出哔哔声。虽然扫描非常好。那边没有声音。我没有在 SDK 中找到任何标志来控制声音。有人遇到这个问题吗?我是 ZBar 的新手。先感谢您。据
我正在使用 raspberry pi 相机从图像中读取条形码,并且在我的应用程序中对象需要离相机相对远。处理前的条码: Zbar 无法解码此图像的任何内容,我决定尝试手动编辑图像以使其解码。在条形码的
我正在尝试在我的树莓派上安装 zbar。我通过输入以下内容构建源: ./配置 制作 进行安装 安装完成后,我输入 python 并尝试导入 zbar。这样做会导致段错误。 对可能出现的问题有什么想法吗
我试过以下 2 个库来读取 QR 码(不是条形码)。 https://github.com/DushyanthMaguluru/ZBarScanner http://zbar.sourceforge.
我正在尝试通过 ZBar 扫描本地镜像,但由于 ZBar 不提供任何 Android 文档,而只提供 detailed documentation for iPhone我定制的相机测试 Activit
本文整理了Java中me.dm7.barcodescanner.zbar.ZBarScannerView类的一些代码示例,展示了ZBarScannerView类的具体用法。这些代码示例主要来源于Git
我在我的一个应用程序中使用 zbar QR 码扫描仪,它可以正确扫描所有 QR 码,但我的问题是它经常扫描并发出哔哔声,就好像它检测到 QR 码一样,当没有那里有二维码。因此,例如我将它放在离我的 t
我正在使用下面的代码使用 Zbar sdk 扫描条形码。 我浏览related question of stackoverflow但这个答案对我不起作用。 到目前为止我已经完成了, -(IBActio
在我的应用程序中,我集成了 Zbar SDK 扫描器,虽然扫描通常可以正常工作,但我的情况有时是 didfinishpickingmediawithInfo: 委托(delegate)方法触发两次。这
我想使用Zbar sdk扫描静态UIImage,它给出了错误,即 ZBarSymbol为空 我也检查了 ZBarReaderController:UIImagePickerController 但是因
我在将相机/扫描仪设置为横向模式时遇到问题,即使我将屏幕更改为横向,但相机/扫描仪仍然显示为垂直。 我可以知道应该怎么做才能解决这个问题吗?在相机 API 上还是应该在 zbar 库上更改? 谢谢。
我们如何将矩形带在相机上进行条码扫描,就像带有扫描声的红色激光一样?是否有任何内置属性?我尝试了以下操作: reader.readerView.tracksSymbols = YES; reader
我正在运行用于条形码扫描的示例代码,但在按下主页按钮后,当我重新启动应用程序时,摄像头无法正常工作,并且出现黑屏。有人明白原因吗? 代码: public void onCreate(Bundle sa
我当时使用 zbar 扫描任何条形码,这个 API 扫描条形码也扫描图像。任何人都请帮我做这件事...假设我在那个瓶子里有一个 Mazza 瓶子 条码在那里 但特定的条码在橙色塑料上。我曾经扫描过任何
我是一名优秀的程序员,十分优秀!