2011-09-28 33 views
22

Yazdığım uygulama kamera işlevselliği gerektirir. ,android kamera manzara modunda gerilmiş

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html

benim manifest'te aktiviteyi koyduk manzara modunda bunun için ekran yönünü ayarlayın: Yani kamerayı çalıştırmak hakkında bilgi edinmek için, bu senaryoyu takip etti.

Sorun şu ki, fotoğraf makinesi yana doğru tutulduğunda (böylece Galaxy Tab P1000'i yatay konumda tutuyor), görünüm uzatılıyor.

Komut dizim hakkında daha spesifik olmak için, Google'ın yaptığı bir kodun tam kopyasını kullandım. Bu, android-sdk \ samples \ android-8 \ ApiDemos \ src \ com \ example \ android \ apis \ graphics \

dosyasında bulunabilir. Dosyaya kendisi CameraPreview denir.

Ekranın neden bu kadar gergin durduğuna dair hiçbir fikrim yok. Tabii ki, format garip ve kare değil, ama yine de, cihazda yüklü olan varsayılan kamera uygulamasını kullanırken, hiç deforme olmuyor. Bu kamera, görüntüyü yana doğru tuttuğumda ve kamerayı biraz hareket ettirdiğinde deforme ediyor. Yaptıklarımı

enter image description here

enter image description here

oldu: o zaman benim Galaxy telefonumla fotoğrafını çekti (bu durumda laptop) bir nesnenin resmini çekmek için benim galaksi sekmesine düzenledi. Galaxy'da yaptığım uygulamada kamera ekranını açarım. Bu her iki görüntü için de geçerli. Bir yanımda tutuyorum ve bir tane portre görünümünde tutuyorum. Resimler biraz net değil ama manzara resminde kameranın geniş çapta büyüdüğünü görebiliyorsunuz.

+3

T_T Dünyada bu problemi yaşayan tek ben miyim? <: –

+0

Bu sorunu yaşıyorum da ... – Saty

+0

Bu soru bir gizli mücevher!Bunu aramakta zorlandım. Tüm anahtar kelimeleri google'da kullandım. Bu soru hayatımı kurtardı. Asıl problemi tanımlamak için –

cevap

21

Aynı problemle dün karşılaştım. Bir "Kamera" kaynağı araştırmasından sonra, kamera önizlemesinin gerilmesi için bir neden buldum.

Bunun nedeni: SurfaceView en boy oranı (genişlik/yükseklik), önizleme parametrelerinde kullanılan Camera.Size en boy oranıyla aynı olmalıdır. En boy oranı aynı değilse, gergin görüntü elde edersiniz.

Bu nedenle, en hızlı çözüm, SurfaceView öğesini 320px x 240px - en küçük desteklenen boyutta olacak şekilde Parameters.getSupportedPreviewSizes() boyutuna getirmektir.

Ayrıca, Camera standart uygulama kaynaklarına bakabilirsiniz, SurfaceView boyutunu kontrol etmek için özel düzeni kullanır (bkz. PreviewFrameLayout.java, onMeasure() işlevi).

Kullanım

git clone https://android.googlesource.com/platform/packages/apps/Camera.git

Kamera kaynaklarını alır.

+1

+1. SurfaceView'de SurfaceView'ın yüksekliğini ve genişliğini bulabilir, ardından en yakın eşleşmeyi bulmak ve SurfaceView'i istenen kabul edilebilir boyuta ayarlamak için Kamera parametreleri nesnesinde getSupportedPreviewSizes öğesini kullanabilirsiniz. –

+0

Böyle yapıyorum ama işe yaramıyor. özel Camera.Size getBestPreviewSize (int genişlik, int yükseklik, Camera.Parameters parametreleri) { \t Camera.Size result = null; için \t (Camera.Size boyutu: parameters.getSupportedPreviewSizes()) { \t \t halinde (size.width <= genişlik && size.height <= yükseklik) { \t \t \t halinde (sonuç == null) { \t \t \t \t sonuç = boyut; Başka \t \t \t} \t \t \t { \t \t \t \t int resultArea = result.width * result.height; \t \t \t int newArea = size.width * size.height; \t \t \t \t halinde (newArea> resultArea) { \t \t \t \t \t sonuç = büyüklüğü; \t \t \t \t} \t \t \t} \t \t} \t} dönüş (sonuç); } – gIrL

+1

Kodunuz sadece başlangıç ​​genişlik ve yüksekliğine uyan en büyük önizleme boyutunu arıyor. Elbette uzatılmış ekran ile ilgili problemleriniz var çünkü en büyük "en boy oranı" anlamına gelmiyor. Önizlemenizi sığdırmanız gerekir Boyutu veya genişliğini ayarlayarak, bu en büyük "boyut" boyutuna bakın, bu oran = width/height başlangıç ​​değerleri (width, height) ve final değerleri (result.width, result.height) – Lord

7
public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

     try { 
      camera = Camera.open(); 

      camera.setDisplayOrientation(90); 
      camera.setPreviewDisplay(holder); 
      Camera.Parameters parameters = camera.getParameters(); 
      List<Size> sizes = parameters.getSupportedPictureSizes(); 
      parameters.setPictureSize(sizes.get(0).width, sizes.get(0).height); // mac dinh solution 0 
      parameters.set("orientation","portrait"); 
      //parameters.setPreviewSize(viewWidth, viewHeight); 
      List<Size> size = parameters.getSupportedPreviewSizes(); 
      parameters.setPreviewSize(size.get(0).width, size.get(0).height); 
      camera.setParameters(parameters); 
      camera.startPreview(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

Sadece getSupportedPreviewSizes() ihtiyaç ve List kaydetmek: Bu size yardımcı olur umarım

List<Size> size = parameters.getSupportedPreviewSizes(); 
      parameters.setPreviewSize(size.get(0).width, size.get(0).height); 
      camera.setParameters(parameters); 



camera.startPreview(); 

.

İlgili konular