Android 从我的自定义相机视图通过intent使用ZXing条形码扫描仪时出错
我有一个有趣的问题给你们大家 我的应用程序: 我有一个自定义的摄像头视图,在此之上,我向用户显示额外的信息处理值等等。我在相机视图的顶部还有一个按钮,通过单击该按钮,我试图使用ZXing库中的IntentIntegrator.java和IntentResult.java文件进行ZXing-by-intent扫描。扫描结果应提供额外信息,显示在摄像机视图顶部 问题是: 这似乎经常发生,但并不总是有趣的事情。当我通过intent从自定义摄像头视图转到zxing条形码扫描仪应用程序时,我收到错误消息:对不起,android摄像头遇到问题。您可能需要重新启动设备。这种情况几乎总是发生在我在自定义相机视图中处于横向模式时,而不是在纵向模式时,但在该模式下仍然会发生。仅供参考,条形码扫描仪应用程序始终以横向模式运行。我听说过很多关于zxing库和这个通过intent方法扫描的好东西,所以我真的只想消除这个错误 以下是我的清单和主应用程序中的一些代码:Android 从我的自定义相机视图通过intent使用ZXing条形码扫描仪时出错,android,android-intent,android-camera,zxing,Android,Android Intent,Android Camera,Zxing,我有一个有趣的问题给你们大家 我的应用程序: 我有一个自定义的摄像头视图,在此之上,我向用户显示额外的信息处理值等等。我在相机视图的顶部还有一个按钮,通过单击该按钮,我试图使用ZXing库中的IntentIntegrator.java和IntentResult.java文件进行ZXing-by-intent扫描。扫描结果应提供额外信息,显示在摄像机视图顶部 问题是: 这似乎经常发生,但并不总是有趣的事情。当我通过intent从自定义摄像头视图转到zxing条形码扫描仪应用程序时,我收到错误消息:
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
下面是我的onActivityResult方法中的一些代码:
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode,intent);
TextView tvInf = (TextView) findViewById(7);
if(resultCode == RESULT_OK ){
// Have got scanning result
String scanContent = scanningResult.getContents();
tvInf.setBackgroundResource(R.drawable.customborder);
tvInf.getBackground().setAlpha(160);
tvInf.setText(scanContent);
}else {
// Didn't receive any scan data
tvInf.setText("");
tvInf.setVisibility(View.INVISIBLE);
Toast toast = Toast.makeText(getApplicationContext(), "No scan data received!", Toast.LENGTH_LONG);
toast.show();
}
这是我的自定义摄影机视图类:
// Class for adding camera to the custom surface view
public class CustomCameraView extends SurfaceView implements SurfaceHolder.Callback {
Camera camera;
SurfaceHolder previewHolder;
boolean previewing = false;
// Constructor :
@SuppressWarnings("deprecation")
public CustomCameraView(Context context) {
super(context);
previewHolder = this.getHolder();
int sdk = android.os.Build.VERSION.SDK_INT;
if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB ){
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
previewHolder.addCallback(this);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null){
camera.stopPreview();
camera.release();
camera = null;
previewing = false;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
camera.setDisplayOrientation(90);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if(previewing){
camera.stopPreview();
previewing= false;
}
// Checking to see if natural device orientation is Portrait or Landscape :
if (width > height){
camera.setDisplayOrientation(0);
Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
camera.setParameters(parameters);
}else {
camera.setDisplayOrientation(90);
Parameters parameters = camera.getParameters();
parameters.setPreviewSize(height, width);
camera.setParameters(parameters);
}
try {
camera.setPreviewDisplay(previewHolder);
camera.startPreview();
previewing = true;
} catch (Exception e) {e.printStackTrace();}
}
}
我真的希望有人能回答这个问题,因为我更愿意进入我的应用程序中更复杂的阶段:
当做
Joar您试图使用Intents将条形码扫描仪作为外部应用程序调用,但同时也将大量项目代码粘贴到了您的应用程序中。这完全没有必要,这是你的问题。将其卸下,然后按照中给出的说明在哪个设备上进行测试?它安装了什么Android版本?希望您使用的是最新的zxing库。我正在测试三星Galaxy S3和三星Galaxy Tab 2 10.1。Android版本4.3在S3上,4.2在标签上。我从GitHub的zxing库中获得了IntentIntegrator.java和IntentResult.java,我认为这是最新版本。感谢Sean的快速响应。我不确定我是否完全理解这些方向。我必须导入一个库吗?在这种情况下,导入哪个库?我读了之前的一篇文章,在那里我可以得到两个.java意图处理程序类,并将它们添加到我的project.No中。您只需使用IntentIntegrator和IntentResult类。如果最简单的话,您可以复制源代码,但它也可以作为Maven依赖项提供,因此您也可以只获取.jar文件。这是我最初尝试的,我复制了IntentIntegrator和IntentResult,如问题中所述。但是现在我删除了这两个类,并尝试将.jar文件添加到构建路径中。这导致了一些奇怪的错误。我不能使用我的android.R库,或任何自定义菜单或绘图。有什么建议吗?否则这些课程不会影响你的应用程序。你还有其他错误。删除所有其他项目代码。
// Class for adding camera to the custom surface view
public class CustomCameraView extends SurfaceView implements SurfaceHolder.Callback {
Camera camera;
SurfaceHolder previewHolder;
boolean previewing = false;
// Constructor :
@SuppressWarnings("deprecation")
public CustomCameraView(Context context) {
super(context);
previewHolder = this.getHolder();
int sdk = android.os.Build.VERSION.SDK_INT;
if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB ){
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
previewHolder.addCallback(this);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null){
camera.stopPreview();
camera.release();
camera = null;
previewing = false;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
camera.setDisplayOrientation(90);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if(previewing){
camera.stopPreview();
previewing= false;
}
// Checking to see if natural device orientation is Portrait or Landscape :
if (width > height){
camera.setDisplayOrientation(0);
Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
camera.setParameters(parameters);
}else {
camera.setDisplayOrientation(90);
Parameters parameters = camera.getParameters();
parameters.setPreviewSize(height, width);
camera.setParameters(parameters);
}
try {
camera.setPreviewDisplay(previewHolder);
camera.startPreview();
previewing = true;
} catch (Exception e) {e.printStackTrace();}
}
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Setting no title bar and full screen feature on
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//Creating new frame layout:
FrameLayout frame = new FrameLayout(this.getApplicationContext());
setContentView(frame);
frame.setId(10); // FrameLayout ID=10
//Creating new camera view and adding this to frame
cv = new CustomCameraView(this.getApplicationContext());
cv.setId(11); // ID = 11
frame.addView(cv);