2013-03-23 65 views
8

我正在與這樣一個偉大的庫zxing讀取QR碼。我已經成功地獲得了QR碼。Zxing中的QR碼自定義攝像頭視圖和旋轉?

現在,我的應用程序運行在橫向模式下,相機拍攝整個屏幕,紅色QR檢測矩形框位於中間。我想將其改爲肖像模式&用紅色QR檢測矩形框替換相機視圖。

我更改了zxing庫清單文件中的CaptureActivity標記。

android:screenOrientation="portrait"

但是什麼都沒發現,我真正想要的。我不知道我必須更改/編寫代碼才能獲得此內容。

+1

調整很簡單,但需要多個文件間的一點變化。在這裏,我已經把一個完整的解決方案這個問題:http://stackoverflow.com/questions/16252791/how-to-show-zxing-camera-in-portrait-mode-android/16252917#16252917 – Roylee 2013-04-27 14:55:24

+1

@Roylee:謝謝,你的代碼也運行以及.. – 2013-06-23 10:46:37

回答

5

我在同樣的問題,並陷入了約2天。 其實你必須做一些任務來實現你的目標。

讀QR碼
  1. 下載斑馬線庫。(希望你已經)
  2. 創建一個項目並添加斑馬線庫。
  3. 你的main.xml文件應該是這樣:

    <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
    
    <TextView 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello" /> 
    
    <FrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_gravity="center_horizontal"> 
        <include layout="@layout/capture"/> 
    </FrameLayout> 
    
    </LinearLayout> 
    
  4. 您的主要活動應該是這樣的:

    public class ScannerActivity extends CaptureActivity { 
    
         @Override 
         public void onCreate(Bundle savedInstanceState) { 
          super.onCreate(savedInstanceState); 
          setContentView(R.layout.main); 
    
         } 
    
         @Override 
         public void handleDecode(Result rawResult, Bitmap barcode) 
         { 
        Toast.makeText(this.getApplicationContext(), "Scanned code " + rawResult.getText(), Toast.LENGTH_LONG).show(); 
         } 
        } 
    
  5. 在manifest文件中添加以下權限:

    <uses-permission android:name="android.permission.CAMERA"/> 
    
  6. 最後非常重要的任務,你需要對相機rotatio做Ñ問題中,將以下方法進

CameraManager.java(在包com.google.zxing.client.android.camera)

@SuppressLint("NewApi") public void startPreview() { 
    Camera theCamera = camera; 
    if (theCamera != null && !previewing) { 
     theCamera.setDisplayOrientation(90); 
     theCamera.startPreview(); 
     previewing = true; 
    } 
    } 

僅此而已。運行並享受:-)

謝謝..

+0

您必須擴展它前級CaptureActivity更改爲非決賽。 – 2013-10-25 05:57:43

+0

任何人在Delphi XE5中使用它? – 2014-03-25 14:18:00

1

由於同樣的原因,我從這個庫中獲得了非常可怕的經驗。看起來,即使您在縱向模式下顯示相機,它也會被拉長(或者輸出圖像會被拉伸,或者條形碼不會被感知,或者某些設備工作正常,而其他設備則無法正常工作)。

我懷疑Android只是簡單地「喜歡」相機預覽處於橫向模式,因爲這是用戶拍照時的自然方向。

最後,我所做的是使用橫向模式並旋轉其他所有東西,所以用戶認爲它是縱向模式,但事實並非如此。我認爲很多應用都使用這種技術。

我建議,如果您以某種方式設法解決這個問題,請在儘可能多的設備上進行測試。

+0

庫本身完全不關心的方向。該應用程序是景觀而已,所以你不能使用它的肖像 - 但你應該寫反正一個新的應用程序。安卓相機「通常」安裝,以便風景是自然的方向,但你必須查詢的API實際上肯定知道!是的,您實際上不必旋轉圖像,但您必須正確匹配預覽分辨率和旋轉。 – 2013-03-23 23:07:23

+0

你有什麼樣展示如何做到這一點,對於簡單的攝像頭應用程序(預覽和捕獲),一個用於這個庫? – 2013-03-24 06:57:52

+0

問題是沒有足夠的示例/教程。只有這個程序笑 – 2013-11-19 14:21:25

5

首先,請不要完全複製我們的應用程序。在這種情況下,你將需要編寫自己的應用程序;這絕對不像改變佈局方向那麼簡單。用戶界面不僅不是爲了肖像而編寫的,也不是應用程序代碼。

如果你想使用只有固定肖像模式,那麼這並不難。使用前置/後置攝像頭完全支持所有4次旋轉,很難得到正確的結果。但不僅僅是一例。

首先你需要設計一個肖像模式的用戶界面。 (請不要複製紅線設計。)

實際的應用程序代碼不關心QR碼的方向。你根本不需要做任何事情。但是您需要進行更改才能正確顯示屏幕。

您需要查詢Camera.getOrientation()來檢測攝像機的安裝方式。通常情況下,「向上」就在您的右側,我認爲幾乎所有設備都以這種方式兼容。但從技術上講,您需要知道如何旋轉預覽圖像。

然後,您使用Camera.setDisplayOrientation()來告訴它旋轉圖像的旋轉程度,以使其正確旋轉至肖像模式屏幕。這通常是「90」。

最後,您需要選擇Camera.Parameters.setPreviewSize()的預覽尺寸,但可能需要翻轉您選擇的值(480x800與800x480),因爲您的肖像正在顯示。