2010-01-12 35 views
26

Tôi đã sao chép mã từ the answer here và tôi vẫn nhận được lỗi RuntimeException: setParameters lỗi trên nexus one. Tệp kê khai của tôi có quyền đối với máy ảnh và quyền wake_lock. Điều này hoạt động trên giả lập, và trên droid tôi không nhận được lỗi nhưng nó có một vấn đề xoay.RuntimeException trên Camera.setParameters() trên nexus one

Trả lời

41

Bạn rất có thể đang yêu cầu kích thước xem trước không hợp lệ. Nếu bạn kiểm tra kết quả của adb logcat có thể bạn sẽ thấy một cái gì đó như thế này:

E/QualcommCameraHardware(22732): Invalid preview size requested: 480x724 

Giải pháp là để yêu cầu kích thước xem trước gần nhất có sẵn cho một trong những bạn muốn; bạn có thể nhận danh sách các kích thước xem trước có sẵn bằng cách gọi getSupportedPreviewSizes trong đối tượng Camera.Parameters được trả lại bởi Camera.getParameters.

+0

Bạn là đúng, ngoại trừ việc nó đã cố gắng để thiết lập nó để 320x480 và 480x320 sẽ làm việc. Điều này đưa tôi đến câu hỏi tiếp theo của tôi, tại sao phương thức SurfaceHolder.Callback.surfaceChanged() được gọi với độ phân giải thấp như vậy thậm chí không khớp với tỷ lệ khung hình của thiết bị? –

+2

@Erik B - Tôi nhận thấy đây là phản hồi muộn cho nhận xét này nhưng có thể do ứng dụng của bạn ở chế độ tương thích và hệ thống đang xử lý pixel trong ứng dụng của bạn là 0,66x độ phân giải thiết bị thực tế. Vì vậy, 480x800 sẽ được hiển thị cho ứng dụng của bạn dưới dạng 320x533, có thể cạo một vài pixel theo chiều ngang hoặc chiều dọc cho thanh trạng thái trừ khi hoạt động của bạn ở chế độ toàn màn hình. –

+0

Bạn làm gì trước phiên bản API 5? (Hãy nói rằng tôi muốn tương thích với android 1.5) – uvgroovy

26

tôi sửa chữa điều này bằng cách làm những gì La Mã cho biết, với các mã:

Camera.Parameters parameters = camera.getParameters(); 
    List<Camera.Size> sizes = parameters.getSupportedPreviewSizes(); 
    Camera.Size cs = sizes.get(0); 
    parameters.setPreviewSize(cs.width, cs.height); 
    camera.setParameters(parameters); 
10

Đối với những gì nó có giá trị, nguồn gốc của vấn đề của tôi kết thúc lên được rằng tôi đã cố gắng để gọi parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); mà không xác minh rằng chế độ flash được hỗ trợ bằng cách kiểm tra xem parameters.getFlashMode() != null.

Có nhiều nguyên nhân gây ra ngoại lệ kém tài liệu này, vì vậy hãy kiểm tra tất cả các thông số của bạn và không chỉ rằng bạn đang sử dụng supportedPreviewSize.

+0

Điều này đã giúp tôi. :) cảm ơn bạn đã chia sẻ –

+1

nếu (! getBaseContext(). getPackageManager(). hasSystemFeature ( PackageManager.FEATURE_CAMERA_FLASH)) { // Đèn flash máy ảnh không khả dụng trên thiết bị } –

2

Không có giải pháp nào ở trên giải quyết vấn đề này cho tôi. Thêm mã này trước khi thiết lập các tham số đã làm.

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

//now set your parameters 
0

Một số dự án máy ảnh mã nguồn mở như opencamera luôn luôn sử dụng try-catch gọi Camera.setParameters:

private void setCameraParameters(Camera.Parameters parameters) { 
    if(MyDebug.LOG) 
     Log.d(TAG, "setCameraParameters"); 
    try { 
     camera.setParameters(parameters); 
     if(MyDebug.LOG) 
      Log.d(TAG, "done"); 
    } catch (RuntimeException e) { 
     // just in case something has gone wrong 
     if(MyDebug.LOG) 
      Log.d(TAG, "failed to set parameters"); 
     e.printStackTrace(); 
     count_camera_parameters_exception++; 
    } 
} 

ngoài, luôn luôn mới nhất từ ​​getParameters trước khi bạn gọi setParameters như thế này:

void setRotation(int rotation) { 
    Camera.Parameters parameters = this.getParameters(); 
    parameters.setRotation(rotation); 
    setCameraParameters(parameters); 
} 
0

giải pháp từ Sam là chính xác nhưng hình ảnh đầu ra vẫn được thu nhỏ một chút trên một số thiết bị máy tính bảng. Một trong những phương pháp hay nhất mà tôi tìm thấy trên Internet, chúng tôi nên đặt trong Máy chủ lưu trữ để các thuộc tính sẽ được sử dụng lại mỗi lần máy ảnh được tiếp tục. Đây là phương pháp được triển khai trong CameraHost:

@Override 
     public Parameters adjustPreviewParameters(Parameters parameters) { 
      List<Camera.Size> sizes = parameters.getSupportedPreviewSizes(); 
      Camera.Size cs = sizes.get(0); 
      parameters.setPreviewSize(cs.width, cs.height); 
      return super.adjustPreviewParameters(parameters); 
     } 
2

Đối với tôi điều này sẽ xảy ra sau khi chụp ảnh và xem trước sẽ đóng băng, cho đến khi tôi cập nhật cuộc gọi cho các tham số như sau. Nó luôn luôn quan trọng với lỗi này để đảm bảo bạn kiểm tra tất cả các thông số mà máy ảnh được yêu cầu đặt để đảm bảo rằng mọi thông số bạn yêu cầu máy ảnh tự thiết lập là có thể cho máy ảnh.

Camera.Parameters parameters = myCamera.getParameters(); 

Với kích thước xem trước:

if (myCamera.getParameters().getSupportedPreviewSizes() != null){ 
    Camera.Size previewSize = getOptimalPreviewSize(myCamera.getParameters().getSupportedPreviewSizes(), width, height);; 
    parameters.setPreviewSize(previewSize.width, previewSize.height); 
} 

Với chế độ flash/Trọng tâm:

if(parameters.getSupportedFocusModes() != null && parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){ 
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
} 

if (parameters.getSupportedFlashModes() != null && parameters.getSupportedFlashModes().contains(Camera.Parameters.FLASH_MODE_AUTO)){ 
    parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO); 

} 

myCamera.setParameters(parameters); 

vv Tất cả những điều này được bọc trong một thử thoải mái {} catch() {} hoạt động tốt. Chúc may mắn.

Đây là Kích getOptimalPreview từ this great tutorial:

private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int width, int height) 
    { 
     // Source: http://stackoverflow.com/questions/7942378/android-camera-will-not-work-startpreview-fails 
     Camera.Size optimalSize = null; 

     final double ASPECT_TOLERANCE = 0.1; 
     double targetRatio = (double) height/width; 

     // Try to find a size match which suits the whole screen minus the menu on the left. 
     for (Camera.Size size : sizes){ 

      if (size.height != width) continue; 
      double ratio = (double) size.width/size.height; 
      if (ratio <= targetRatio + ASPECT_TOLERANCE && ratio >= targetRatio - ASPECT_TOLERANCE){ 
       optimalSize = size; 
      } 
     } 

     // If we cannot find the one that matches the aspect ratio, ignore the requirement. 
     if (optimalSize == null) { 
      // TODO : Backup in case we don't get a size. 
     } 

     return optimalSize; 
    } 
Các vấn đề liên quan