2015-11-07 20 views
5

tôi đã tạo ra một ứng dụng máy ảnh tùy chỉnh sử dụng this mã nguồn, nhưng trên vài thiết bị (như trên độ phân giải cao Devices) Tôi nhận:Máy ảnh java.lang.RuntimeException: setParameters thất bại

RuntimeException setParameters failed 

tôi đang phải đối mặt này ngoại lệ, vì điều này:

params.setPictureSize(1200, 900); 

Và tôi đã nhận thấy, Nếu tôi sử dụng (1600, 1200) thay vì (1200, 900) sau đó tôi không phải đối mặt với những vấn đề như

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

Bạn có thể thấy completeCameraActivity đang lớp here

Và đây là lớp CameraPreview tôi:

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

đó là số dòng '124'? –

+0

vui lòng xác định dòng số 124 –

+0

@ ρяσѕρєяK số dòng 124 là mCamera.setParameters (params); – Sonali

Trả lời

10

Issue là do:

params.setPictureSize(1200, 900); 

vì kích thước yêu cầu không được suppoerted bởi camera.

Sử dụng getSupportedPictureSizes để nhận tất cả kích thước xem trước có sẵn.

Để kiểm tra đó là kích thước hình ảnh tối đa có sẵn từ máy ảnh:

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 cảm ơn bạn rất nhiều, nhưng những gì Nếu tôi muốn lưu hình ảnh của tôi ở kích thước 1200 X 900 vào sdcard – Sonali

+0

@Sonali: bạn có thể làm điều đó bằng cách thay đổi trong chiều rộng cao của Bitmap được trả về từ Camera cho hình ảnh trước khi lưu vào thẻ SD. nhưng có lẽ điều này sẽ ảnh hưởng đến chất lượng hình ảnh. hãy thử nó cho tôi biết –

0

Mọi ứng dụng Máy ảnh bị hạn chế bởi Camera HAL được hỗ trợ cho thiết bị đó. Vì vậy, trong Camera HAL, chúng tôi xác định rằng chúng tôi sẽ cung cấp danh sách kích thước được hỗ trợ, các kích thước này có thể là kích thước xem trước, kích thước hình ảnh hoặc kích thước video. vì vậy tôi nghĩ rằng bạn đang đối mặt với vấn đề này, vì 1200 * 900 không được hỗ trợ bởi máy ảnh HAL hoặc mã cấp thấp hơn.

+0

chính xác, tôi đồng ý với bạn ... và cảm ơn thông tin nhưng tôi có thể kiểm soát nó như thế nào? – Sonali

+0

Thực ra bạn không thể .. những gì bạn có thể làm là, tìm nạp kích thước được hỗ trợ và viết mã của bạn cho phù hợp. – Rahul

Các vấn đề liên quan