2010-10-08 61 views
51

Uygulamamda kamera işlevselliğini ekledim. Ben de uygulamayı piyasaya sürdüm. Kullanıcılardan birinden kamera açarken hata aldığını bildiren bir hata mesajı aldım.camera.setParameters android başarısız oldu

Bu uygulamayı cihazda 2.1 üzerinde test ettim. Ben kullanıcıdan var hata da kontrol etmek

java.lang.RuntimeException: setParameters failed 
at android.hardware.Camera.native_setParameters(Native Method) 
at android.hardware.Camera.setParameters(Camera.java:647) 
at com.CameraApp.Preview.surfaceChanged(Preview.java:67) 
at android.view.SurfaceView.updateWindow(SurfaceView.java:538) 
at android.view.SurfaceView.dispatchDraw(SurfaceView.java:339) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
at android.view.View.draw(View.java:6743) 
at android.widget.FrameLayout.draw(FrameLayout.java:352) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
at android.view.View.draw(View.java:6743) 
at android.widget.FrameLayout.draw(FrameLayout.java:352) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842) 
at android.view.ViewRoot.draw(ViewRoot.java:1407) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:1163) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4627) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 

Ben 2.2 emülatörünüzde app koştu ... İşte aldık logcat hatası var ... çoğunlukla 2.2 çalışacaktır nexus birini kullanıyor. Ama iyi çalıştı. Herkes bana neden hata oluştuğunu söyleyebilir mi? değil tüm cihazlar keyfi önizleme boyutunu destekler çünkü başarısız

class Preview extends SurfaceView implements SurfaceHolder.Callback 
{ 
    private static final String TAG = "Preview"; 

    SurfaceHolder mHolder; 
    public Camera camera; 

    Preview(Context context) 
    { 
     super(context); 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void surfaceCreated(SurfaceHolder holder) 
    { 
     // The Surface has been created, acquire the camera and tell it where 
     // to draw. 
     camera = Camera.open(); 
     try { 
     camera.setPreviewDisplay(holder); 
     } catch (IOException exception) { 
     camera.release(); 
     camera = null; 
      // TODO: add more exception handling logic here 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     // Surface will be destroyed when we return, so stop the preview. 
     // Because the CameraDevice object is not a shared resource, it's very 
     // important to release it when the activity is paused. 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
    } 

    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 = camera.getParameters(); 
     parameters.setPreviewSize(w, h); 
     camera.setParameters(parameters); 
     camera.startPreview(); 
    } 

    @Override 
    public void draw(Canvas canvas) 
    { 
     super.draw(canvas); 
     Paint p= new Paint(Color.RED); 
     Log.d(TAG,"draw"); 
     canvas.drawText("PREVIEW", canvas.getWidth()/2, canvas.getHeight()/2, p); 
    } 
} 
+0

Kamera parametrelerini değiştireceğiniz kodu yayınlamadıkça, size yardımcı olmak çok zor olacaktır. – CommonsWare

+0

u yanıt için teşekkür ederim Bu sınıfta "Önizleme" olarak adlandırılan ayrı bir sınıfa sahip olduğum bazı yöntemlerden birinin "setParameters()" kullanan "surfaceChanged()" olduğunu geçersiz kılıyor, bu sınıfa kod ekliyorum soru gövdesi lütfen bir göz atın ... ve bu sorunu çözmeme yardımcı olun. –

cevap

109

: Burada

Ben yorum olarak bahsedilen sınıftır. Görünüşe göre bazı şeyler var ama ona güvenemezsin. senin surfaceChanged yöntemde böyle bir şey yapmak gerekir:

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    Camera.Parameters parameters = camera.getParameters(); 
    List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); 

    // You need to choose the most appropriate previewSize for your app 
    Camera.Size previewSize = // .... select one of previewSizes here 

    parameters.setPreviewSize(previewSize.width, previewSize.height); 
    camera.setParameters(parameters); 
    camera.startPreview(); 
} 

Sen burada referans vb

boy oranını kaybetmezler, böylece bu ölçek bir yolunu gerekecek Android SDK doc.

+0

u teşekkür ederim, ben yukarıdaki kodu denedim, ama 2.1'den itibaren. ayrıca bazı hatalar veriyor. cep telefonunun yönelimini dikeyden manzaraya değiştirdiğimde sorun, gerçek cihaz görüntüsünde önizleme için boş değerler veriyor, 0kb ile saklanıyor, portre olarak iyi çalışıyor ve hem portre hem de yatay modda emülatörde iyi çalışıyor ,, –

+0

Tamam 2.1'den önce nasıl yapacağımı bilmiyorum. HTC Evo'da da benzer bir sorun yaşadım ve bu şekilde etrafta dolaştım. Sorun, önizleme setini mutlaka istediğiniz şekilde ayarlayamamanızdır (tüm telefonlar bunu desteklemeyecektir). PreviewSize, çizmekte olduğunuz yüzeyin büyüklüğünde olması gerekmiyorsa, mutlaka yardımcı olacaktır. – macbutch

+0

Bunun için teşekkürler, 2.2 'getSupportedPreviewSizes' 'getPreviewSize' ile değiştirmek zorunda kaldım, ancak gerisi sadece çalışır. – kolenda

İlgili konular