2015-11-07 24 views
5

Stworzyłem aplikację zwyczaj kamery za pomocą this kodu źródłowego, ale na kilku urządzeniach (jak na wysokiej rozdzielczości Devices) Otrzymuję:Camera java.lang.RuntimeException: setParameters udało

RuntimeException setParameters failed 

jestem stoi to wyjątkiem, ze względu na to:

params.setPictureSize(1200, 900); 

i zauważyłem, Jeśli używam (1600, 1200) zamiast (1200, 900) wtedy nie jestem w obliczu takich problemów

Logcat:

11-07 11:45:20.630: E/AndroidRuntime(3827): FATAL EXCEPTION: main 
11-07 11:45:20.630: E/AndroidRuntime(3827): java.lang.RuntimeException: Unable to resume activity {pl.gatti.dgcam/pl.gatti.dgcam.DgCamActivity}: java.lang.RuntimeException: setParameters failed 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2825) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2854) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2318) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at android.app.ActivityThread.access$600(ActivityThread.java:144) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at android.os.Looper.loop(Looper.java:152) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at android.app.ActivityThread.main(ActivityThread.java:5132) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at java.lang.reflect.Method.invoke(Method.java:511) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at dalvik.system.NativeStart.main(Native Method) 
11-07 11:45:20.630: E/AndroidRuntime(3827): Caused by: java.lang.RuntimeException: setParameters failed 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at android.hardware.Camera.native_setParameters(Native Method) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at android.hardware.Camera.setParameters(Camera.java:1490) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at pl.gatti.dgcam.DgCamActivity.createCamera(DgCamActivity.java:124) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at pl.gatti.dgcam.DgCamActivity.onResume(DgCamActivity.java:163) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1185) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at android.app.Activity.performResume(Activity.java:5182) 
11-07 11:45:20.630: E/AndroidRuntime(3827):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2815) 

Kod:

private void createCamera() { 
     // Create an instance of Camera 
     mCamera = getCameraInstance(); 

     // Setting the right parameters in the camera 
     Camera.Parameters params = mCamera.getParameters(); 
     params.setPictureSize(1200, 900); 
     params.setPictureFormat(PixelFormat.JPEG); 
     params.setJpegQuality(85); 
     mCamera.setParameters(params); 

     // Create our Preview view and set it as the content of our activity. 
     mPreview = new CameraPreview(this, mCamera); 
     FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 

     // Calculating the width of the preview so it is proportional. 
     float widthFloat = (float) (deviceHeight) * 4/3; 
     int width = Math.round(widthFloat); 

     // Resizing the LinearLayout so we can make a proportional preview. This 
     // approach is not 100% perfect because on devices with a really small 
     // screen the the image will still be distorted - there is place for 
     // improvment. 
     LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(width, deviceHeight); 
     preview.setLayoutParams(layoutParams); 

     // Adding the camera preview after the FrameLayout and before the button 
     // as a separated element. 
     preview.addView(mPreview, 0); 
    } 

Możesz zobaczyć completeCameraActivity kod klasa here

i tu jest mój CameraPreview klasa:

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 

    public CameraPreview(Context context, Camera camera) { 
     super(context); 
     mCamera = camera; 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     // deprecated setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     mHolder.setFixedSize(100, 100); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, now tell the camera where to draw the 
     // preview. 
     try { 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      Log.d("DG_DEBUG", "Error setting camera preview: " + e.getMessage()); 
     } 

    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     // If your preview can change or rotate, take care of those events here. 
     // Make sure to stop the preview before resizing or reformatting it. 

     if (mHolder.getSurface() == null) { 
      // preview surface does not exist 
      return; 
     } 

     // stop preview before making changes 
     try { 
      mCamera.stopPreview(); 
     } catch (Exception e) { 
      // ignore: tried to stop a non-existent preview 
     } 

     // make any resize, rotate or reformatting changes here 

     // start preview with new settings 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.setDisplayOrientation(90); // Portrait only 
      mCamera.startPreview(); 

     } catch (Exception e) { 
      Log.d("DG_DEBUG", "Error starting camera preview: " + e.getMessage()); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // empty. Take care of releasing the Camera preview in your activity. 
    } 

} 
+0

która jest numer linii '124'? –

+0

proszę zdefiniować linię nr 124 –

+0

@ ρяσρίєK linia 124 to mCamera.setParameters (parametry); – Sonali

Odpowiedz

10

problem jest spowodowany przez:

params.setPictureSize(1200, 900); 

ponieważ wymagany rozmiar nie jest suppoerted przez aparat fotograficzny.

Użyj getSupportedPictureSizes, aby uzyskać wszystkie dostępne rozmiary podglądu.

Aby sprawdzić, który jest maksymalny rozmiar obrazu z kamery dostępny:

List<Size> allSizes = param.getSupportedPictureSizes(); 
Camera.Size size = allSizes.get(0); // get top size 
for (int i = 0; i < allSizes.size(); i++) { 
    if (allSizes.get(i).width > size.width) 
     size = allSizes.get(i); 
} 
//set max Picture Size 
params.setPictureSize(size.width, size.height); 
+0

ok, dziękuję bardzo, ale co jeśli chciałbym zapisać moje obrazy w formacie 1200 X 900 w sdcard – Sonali

+0

@Sonali: można to zrobić, zmieniając wysokość mapy bitowej, która jest zwracana z kamery dla obrazu przed zapisaniem na karta SD. ale prawdopodobnie wpłynie to na jakość obrazu. spróbuj, daj mi znać –

0

Dowolna aplikacja aparatu jest ograniczona przez funkcję kamery HAL obsługiwaną dla tego urządzenia. W definicji Camera HAL określamy, że udostępnimy listę obsługiwanych rozmiarów. Mogą to być rozmiary podglądu, rozmiar obrazu lub rozmiar wideo. , więc myślę, że stoisz w obliczu tego problemu, ponieważ 1200 * 900 nie jest obsługiwany przez kamery HAL lub kod niższego poziomu.

+0

dokładnie, zgadzam się z tobą ... i dziękuję za informację, ale jak mogę przejąć nad nią kontrolę? – Sonali

+0

Właściwie nie możesz .. możesz jedynie pobrać obsługiwany rozmiar i odpowiednio napisać swój kod. – Rahul

Powiązane problemy