2012-10-04 49 views
14

我正在開發一個相機應用基本上作爲郵件應用程序的一部分,附加圖像等應用程式需要連續工作> = 2.2 SDK和:照相機API:跨設備發出

不能使用默認的Android相機像我很樂意,因爲:

  1. 應用程序的性質決定了圖像不應該被保存到磁盤曾經和一些原始設備製造商(三星)喜歡這樣做不給你是一個選擇。

  2. 我不能調用其他任何相機應用可以攔截,因爲那時,應用程序可以保存圖像的意圖。

我目前的問題是處理Android攝像頭顯然不喜歡縱向的事實。具體來說,在一些挖掘後,我正在監視顯示屏,並在輪換時調用setDisplayOrientation(90)。這可行,但Surfaceview尺寸也需要改變,這必須在支持的維度內完成,否則參數設置會崩潰應用程序。

我與另一這樣做SO片斷,我發現here(該getBestPreviewSize()方法),但它有一個明顯的問題,我不能相信我還沒有發現任何人擁有。在takePicture生命週期的

部分涉及調用PostView圖片回調。這是顯示當前暫停的SurfaceView圖像的靜止圖像,該圖像將通過byteArray返回到raw和/或jpeg回調。我的問題是,這個圖像仍然在一些看似隨意的測試設備上傾斜!因此,行爲是用戶以完美的4:3寬高比觀看動態相機圖像,直到他們拍攝照片並且它們呈現的圖像被擠壓。請注意,字節數組本身是正確的,當我在消息傳遞結束點構造Bitmap時,它顯示正常,但這仍然是一個問題。

我看不出在此時如何改變靜態圖像顯示。誰能幫我這個?

+0

你可以保留以前的postview圖片回調,並顯示實際拍攝照片時的情況嗎?你最後可以從拍攝的圖片數據創建一個位圖,並顯示,而不是postview圖像數據?我想這歸結於最終的圖像數據是否搞亂了,或者表面視圖是否有變化。 –

回答

6

Android相機系統是一團糟。而且beind焊接到主板上,相機芯片不會喜歡portait應用程序 - 所有回調都會以相機方向溢出數據(您收到的緩衝區實際上是與本機相機應用程序共享的內存片) - 如果您希望在應用程序出現時顯示它在portait模式下,您將不得不通過xy翻轉此數據。

而不是在相機使用的表面視圖上顯示圖像,我會覆蓋透明ImageView並在那裏繪製我的位圖。

你可能(希望)找出來javaocr project一些靈感,其中在縱向模式的Android後臺程序工作,並繪製位圖上實時預覽。 (請從git結帳,因爲它現在正在發佈,我正在努力與git和maven,請參閱演示目錄)

+0

上週五我做了「解決」,做到了這一點 - 構建一個位圖並顯示它。我試圖避免這種情況,因爲我的應用程序已經非常密集,我們都知道3.0以前的Android本地位圖分配問題。但我離題了......感謝您抽出時間發佈 –

+0

請確保您已在BitSampleSize中設置BitmapFactory選項。它幫助TON解決這些內存問題。 – samuelesque

0

查看此貼子如何將QR掃描儀切換爲肖像:http://code.google.com/p/zxing/issues/detail?id=178。我不知道它是否與你的圖片交換是肖像相關,但也許它提供了一些指導。評論#11似乎是最有幫助的。 (我不贊成將QR應用程序代碼從Sean Owen中刪除)。

3

我懷疑你的問題是在幾個不同的級別。

傳感器安裝

首先,相機傳感器安裝在每個設備上的不同。谷歌有鍋爐板代碼,獲得該方向和設置正確的旋轉值來糾正它here,這是好到API 8

AR修正

第二個問題是很明顯的是,預覽幀AREN與屏幕寬高比相同。您可以使用this文章來解決這個問題。表面視圖尺寸與最佳預覽尺寸沒有關係,這些值不必匹配 - 事實上,您的AR被搞砸了,證明它們不匹配。

預覽框的大小!=圖片大小

最後,當你使用一個takePicture圖片,圖片的大小是完全獨立的預覽畫面的大小。使用下面的查詢和設置預覽框大小: setPreviewSize()/getSupportedPreviewSizes()

使用以下方法來查詢和設置圖片大小(從takePicture()): getSupportedPictureSizes()/setPictureSize()

某些設備可能會得到幸運的是,圖片和預覽框架的默認設置是相同的。所有設備都不是這種情況。

最後,如果您想要顯示拍攝的圖片,您可能還需要對其進行AR校正,如果它與您的SurfaceView尺寸不一樣。或者,您可以將其繪製到ImageView並使用ScaleType.CENTER_INSIDE來保留寬高比。