2012-10-04 19 views
14

私は画像を添付し、メッセージングアプリの一環として、基本的にカメラアプリを開発していますなどのアプリは> = SDK 2.2のために働く必要があります。カメラのAPI:クロスデバイスの問題

私はできないアプリの性質は画像が今までディスクに保存してはならないことを指示し、いくつかのOEM(サムスン)が与えずにこれを行うのが大好き

  1. :ので、私はしてみたいな限りデフォルトのAndroidのカメラを使用しますあなたは選択肢です。

  2. 他のカメラアプリがインターセプトできるという意図は、そのアプリが画像を保存できるため呼び出すことができません。

私の現在の問題は、Androidカメラが縦向きであることを明らかに嫌うという事実に対処しています。具体的には、私はディスプレイを監視しており、回転していくと、setDisplayOrientation(90)と呼んでいます。これは動作しますが、サーフェスビューの寸法も変更する必要があります。サポートされている寸法内で行う必要があります。または、パラメータ設定がアプリをクラッシュさせます。

私はheregetBestPreviewSize()メソッド)という別のSOのスニペットでこれをやっていますが、他の誰かが見つけられなかったとは思わない1つの目立つ問題があります。

takePictureライフサイクルの一部には、PostViewピクチャコールバックの呼び出しが含まれます。これは、現在の一時停止したSurfaceViewイメージの静止画がbyteArrayを介してrawおよび/またはjpegコールバックに返される様子を示しています。私の問題は、この画像は一見無作為のテスト装置の一部にまだ歪んでいるということです!そのため、ユーザーは画像を撮るまでの間、完全な4:3のアスペクト比でダイナミックなカメラ画像を見ることができ、提示された画像は盛り上がってしまいます。バイト配列自体は正しいことに注意してください。メッセージエンドポイントにBitmapを作成すると、それはうまく表示されますが、これはまだ問題です。

この時点で静止画表示を変更する方法はわかりません。誰もこれで私を助けることができますか?

+0

画像を実際に撮影したときに、以前のポストビュー画像のコールバックを保存して表示できますか?最後に撮影した画像データからビットマップを作成し、ポストビュー画像データの代わりにその画像を表示できますか?最終的な画像データが乱れているのか、サーフェスがあなたにどのように形を変えているのか、ということになると思います。 –

答えて

6

Androidのカメラシステムが混乱しています。そして、マザーボードにはんだ付けされて、カメラチップはポートレートアプリケーションを気に入らないだろう - すべてのコールバックがカメラ方向のデータを吐き出す(実際にはネイティブカメラアプリケーションとメモリを共有する) - アプリケーションの実行中に表示したい場合ポートレートモードでは、このデータをxyで反転する必要があります。

カメラで使用されるサーフェスビューに画像を表示する代わりに、透明のImageViewでオーバーレイし、そこにビットマップを描画します。

javaocr projectにはインスピレーションがあります。アンドロイドデーモンはポートレートモードで動作し、ライブプレビューではビットマップを描画します。 (gitからチェックアウトしてください。これは今リリースされており、gitとmavenに苦労しています。デモディレクトリを参照してください)

+0

私はこの最後の金曜日に「解決」を終えました。ビットマップの作成と表示です。私は、アプリがすでにかなりヒープに集中しているので、これを避けようとしていました。私たちはすべて、3.0より前のAndroidのネイティブビットマップ割り当てに関する問題について知っています。しかし、私は脱走します...投稿する時間をとってくれてありがとう –

+0

BitmapFactoryオプションをSampleSizeに設定していることを確認してください。これらのメモリ問題でTONに役立ちます。 – samuelesque

0

QRスキャナをポートレートに切り替える方法については、http://code.google.com/p/zxing/issues/detail?id=178を参照してください。私はそれがあなたの絵を肖像画に交換することに関連しているかどうかはわかりませんが、多少のガイダンスを提供するかもしれません。コメント#11が最も役立つようです。 (私は、QRアプリケーションコードがSean Owenから引き裂かれることを保証していない)。

3

私はあなたの問題がいくつかの異なるレベルにあると思っています。

センサーマウント

まず、カメラセンサーは、すべてのデバイス上の異なる実装されています。 Googleはその方向を取得し、それをhereを修正するために、正しい回転値を設定するためのボイラープレートコードを持っており、それが8

AR補正

第二の問題は、プレビューフレームが上がらないということは明らかであるAPIにダウン良いです画面と同じアスペクト比ではありません。投稿をthisで解決できます。サーフェイスビューのディメンションは、最も良いプレビューサイズとは無関係ですが、それらの値は一致する必要はありません。実際には、ARがうまくいけば、一致しないことが証明されます。あなたがtakePictureを使用して写真を撮るとき

プレビューフレームサイズ!=画像サイズは

は最後に、画像のサイズは、プレビュー枠のサイズとは完全に独立しています。 setPreviewSize()/getSupportedPreviewSizes()

(takePicture(から))画像サイズを照会および設定するには、次を使用します: getSupportedPictureSizes()/setPictureSize()

あなたが得ることができますいくつかのデバイスのプレビュー枠のサイズが照会および設定するには、次を使用します幸運なことに、写真とプレビューフレームのデフォルトは同じになります。これはすべてのデバイスでは当てはまりません。

最後に、撮影した画像を表示したい場合、SurfaceViewと同じサイズでない場合は、AR補正も行う必要があります。あるいは、ImageViewに描画し、ScaleType.CENTER_INSIDEを使用してアスペクト比を保持することもできます。