2015-11-07 6 views
5

J'ai créé une application appareil photo personnalisé à l'aide this code source, mais peu d'appareils (comme sur les appareils haute résolution) J'obtient:Appareil photo: setParameters n'a pas

RuntimeException setParameters failed 

Je suis face à ce exception, en raison de ceci:

params.setPictureSize(1200, 900); 

Et je l'ai remarqué, Si je (1600, 1200) au lieu de (1200, 900) alors je ne suis pas confronté à ces questions

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) 

code:

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

Vous pouvez voir completeCameraActivity code de classe here

Et voici ma CameraPreview classe:

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

qui est le numéro de ligne '124'? –

+0

Veuillez définir la ligne n ° 124 –

+0

@ ρяσѕρєяK le numéro de ligne 124 est mCamera.setParameters (params); – Sonali

Répondre

10

problème est causé par:

params.setPictureSize(1200, 900); 

parce que la taille requise n'est pas suppoerted par caméra.

Utilisez getSupportedPictureSizes pour obtenir toutes les tailles de prévisualisation disponibles.

Pour vérifier quelle est la taille d'image maximale disponible de la caméra:

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 merci beaucoup, mais que faire si je voudrais enregistrer mes images en taille 1200 X 900 en sdcard – Sonali

+0

@Sonali: vous pouvez le faire en changeant en haute-largeur de bitmap qui est retourné par la caméra pour l'image avant de sauvegarder sur carte SD. mais probablement cela affectera la qualité de l'image. essayez-le laissez-moi savoir –

0

Toute application de caméra est limitée par la caméra HAL prise en charge pour ce périphérique. Donc, dans Camera HAL, nous définissons que nous allons fournir une liste de taille supportée, ces tailles pourraient être la taille de l'aperçu, la taille de l'image ou la taille de la vidéo. donc je pense que vous êtes confrontés à ce problème, car 1200 * 900 n'est pas pris en charge par la caméra HAL ou le code de niveau inférieur.

+0

exactement, je suis d'accord avec vous ... et merci pour info mais comment puis-je prendre le contrôle sur elle? – Sonali

+0

En fait vous ne pouvez pas .. ce que vous pouvez faire est, aller chercher la taille supportée et écrire votre code en conséquence. – Rahul