2010-10-08 11 views
51

Dołączyłem funkcję aparatu w mojej aplikacji. Uruchomiłem też aplikację na rynku. Dostałem komunikat o błędzie od jednego z użytkowników, że dostał błąd podczas otwierania aparatu.camera.setParameters failed in android

Testowałem aplikację na urządzeniu w wersji 2.1. Błąd Dostałem od użytkownika jest za pomocą jednego Nexus, który będzie prowadzony głównie 2.2 ... Oto błąd logcat że Dostałem ...

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) 

Pobiegłem aplikację na 2.2 emulatora również to sprawdzić. Ale działało dobrze. Czy ktoś może mi powiedzieć, dlaczego błąd występuje?

Oto klasa których wspominałem w komentarzach:

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

Jeśli nie napiszesz kodu, w którym modyfikujesz parametry aparatu, bardzo trudno będzie Ci pomóc. – CommonsWare

+0

dziękuję za odpowiedź u Mam oddzielną klasę, która jest nazwana jako "Preview" w tej klasie i nadpisuję niektóre metody jeden z nich to "surfaceChanged()", który używa "setParameters()", dodaję kod tej klasy w pytanie, proszę spojrzeć na to ... i pomóż mi rozwiązać ten problem. dziękuję u –

Odpowiedz

109

się niepowodzeniem, ponieważ nie wszystkie urządzenia obsługują dowolne rozmiary podglądu. Najwyraźniej niektórzy mają, ale nie można na nich polegać. W swojej surfaceChanged metody trzeba zrobić coś takiego:

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(); 
} 

Musisz wymyślić sposób skalowania to tak, aby nie stracić proporcje itp

Dla odniesienia tutaj to Android SDK doc.

+0

dziękuję u próbowałem powyższy kod, ale jest od 2.1 wzwyż. daje również pewne błędy. Problem polega na tym, że zmieniając orientację telefonu komórkowego z portretu na krajobraz, daje on wartości zerowe do podglądu w rzeczywistym obrazie urządzenia jest przechowywany z 0kb, działa dobrze w pionie i działa dobrze w emulatorze zarówno w trybie pionowym, jak i poziomym ,, –

+0

OK Nie wiem, jak to zrobić przed 2.1. Miałem podobny problem w HTC Evo i tak się z tym uporałem. Problem polega na tym, że nie zawsze można ustawić rozmiar previewSize na dowolny (nie wszystkie telefony będą go obsługiwać). Rozmiar podglądu niekoniecznie musi być wielkości powierzchni, na którą rysujesz, jeśli to w ogóle pomaga. – macbutch

+0

Dzięki za to, na 2.2 musiałem zastąpić "getSupportedPreviewSizes" z "getPreviewSize", ale reszta po prostu działa. – kolenda