2011-04-13 23 views

回答

0

核心庫獨立於任何特定的設備或平臺,因此「是」。 Barcode Scanner應用程序版本3.6已確認可在Xoom上使用。

3

是的,它確實有效。這些代碼是用java編寫的,所以它幾乎適用於任何設備。永遠,如果你嘗試這個例子,它會使用老的android 2.x,它看起來不適用於蜂窩。所以你將不得不創建自己的相機包裝。圖書館ZXing-1.7.zip的作用是什麼。

以下是使其工作所需的代碼。請注意,它會在標題中顯示條形碼的內容。因此,需要步驟,使其工作:

  1. 在eclipse名爲 「CameraPreview」創建一個新的Android項目和包名稱設置爲「com.example.android.apis.graphics」。
  2. 獲取ZXing-1.7.zip從http://code.google.com/p/zxing/
    1. 從目錄 「ZXing-1.7.zip \斑馬線\核心\ SRC」 提取稱爲 「COM」 的文件夾。
    2. 將提取的文件夾拖放到文件夾中的Eclipse中 src:「CameraPreview \ src」。它會問你是否要替換「com」文件夾,說「是」。
    3. 獲取「ZXing-1.7.zip \ zxing \ android \ src \ com \ google \ zxing \ client \ android \ PlanarYUVLuminanceSource.java」的副本並將其放入名爲「com.google.zxing」的新包中。 client.android「(你必須創建一個新的包)。
  3. 代碼替換 「CameraPreviewActivity.java」 這一個:

CameraPreviewActivity.java:

/* Copyright (C) 2007 The Android Open Source Project */ 

package com.example.android.apis.graphics; 

import com.google.zxing.BinaryBitmap; 
import com.google.zxing.MultiFormatReader; 
import com.google.zxing.ReaderException; 
import com.google.zxing.Result; 
import com.google.zxing.client.android.PlanarYUVLuminanceSource; 
import com.google.zxing.common.HybridBinarizer; 

import android.app.Activity; 
import android.hardware.Camera; 
import android.os.Bundle; 

// ---------------------------------------------------------------------- 

public class CameraPreviewActivity extends Activity { 
    Preview mPreview; 
    Camera mCamera; 
    MultiFormatReader multiFormatReader; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Create a RelativeLayout container that will hold a SurfaceView, 
     // and set it as the content of our activity. 
     mPreview = new Preview(this); 
     setContentView(mPreview); 

     // Setup ZXing. 
     multiFormatReader = new MultiFormatReader(); 
     CameraPreviewActivity.this.getActionBar().setTitle(""); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     mCamera = Camera.open(); 
     mCamera.setPreviewCallback(new Camera.PreviewCallback() { 
      public void onPreviewFrame(byte[] data, Camera camera) { 

       Camera.Size size = camera.getParameters().getPreviewSize(); 
       PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data, size.width, size.height, 0, 0, 
         size.width, size.height, false); 
       BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); 
       try { 
        Result r = multiFormatReader.decode(bitmap); 
        CameraPreviewActivity.this.getActionBar().setTitle(r.getText()); 
       } catch (ReaderException re) { 
        // continue 
       } 
      } 
     }); 
     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.setPreviewCallback(null); 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 
} 

創建一個新的名爲類Preview.java:

/* Copyright (C) 2007 The Android Open Source Project */ 

package com.example.android.apis.graphics; 

import android.content.Context; 
import android.hardware.Camera; 
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; 

// ---------------------------------------------------------------------- 

/** 
* A simple wrapper around a Camera and a SurfaceView that renders a centered preview of the Camera 
* to the surface. We need to center the SurfaceView because not all devices have cameras that 
* support preview sizes at the same aspect ratio as the device's display. 
*/ 
class Preview extends ViewGroup implements SurfaceHolder.Callback { 
    private final String TAG = "Preview"; 

    SurfaceView mSurfaceView; 
    SurfaceHolder mHolder; 
    Size mPreviewSize; 
    List<Size> mSupportedPreviewSizes; 
    Camera mCamera; 

    Preview(Context context) { 
     super(context); 

     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(); 
     } 
    } 

    public void switchCamera(Camera camera) { 
     setCamera(camera); 
     try { 
      camera.setPreviewDisplay(mHolder); 
     } catch (IOException exception) { 
      Log.e(TAG, "IOException caused by setPreviewDisplay()", exception); 
     } 
     Camera.Parameters parameters = camera.getParameters(); 
     parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
     requestLayout(); 

     camera.setParameters(parameters); 
    } 

    @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.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) { 
     // 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.startPreview(); 
    } 
} 

此外,更換的AndroidManifest.xml的內容(這將與Android 3.2蜂窩只有工作,如果你想使它工作的其他版本,你將不得不作出改變這個文件):

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.example.android.apis.graphics" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="13" /> 
    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-feature android:name="android.hardware.camera" /> 
    <uses-feature android:name="android.hardware.camera.autofocus" /> 

    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".CameraPreviewActivity" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

    </application> 
</manifest> 

對不起,版權頁眉,但大部分代碼的兩個類別:CameraPreview.javaPreview.java來自http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html其中包括版權。該死的你。

+0

此代碼必須是答案,它對我來說就像一個魅力。 +1 – Oussaki 2015-04-22 22:54:23

相關問題