2011-12-14 56 views
7

Tôi vừa nhận ra hoạt động của máy ảnh trong một mặt phẳng không hoạt động trên một số thiết bị. Một số DROID mang nhãn hiệu và da điện thoại. Nó hoạt động trên tất cả các điện thoại google với việc triển khai Android chuẩn cho đến nay.Các chức năng của máy ảnh Android không hoạt động trên một vài điện thoại

tôi nhận được một khoảnh khắc ngắn ngủi để gỡ lỗi một thiết bị trên 2.2 (không biết chính xác những gì mẫu điện thoại này được, nhưng nó là da) và tôi thấy trình gỡ lỗi nói (ICamera thất bại) (Camera Lỗi 100)

nhưng tôi đã không có cơ hội để tìm ra chính xác nơi nó đi sai, nhưng tôi thấy rằng những người khác đã gặp phải vấn đề này (một cái gì đó về nhận kích thước xem trước trước khi bắt đầu xem trước ??), nhưng không có phản ứng rõ ràng hoặc bất cứ điều gì trực quan với những gì Tôi có, nhưng đây là mã máy ảnh của tôi, điều gì sẽ làm cho công việc này phổ biến hơn?

//this is in OnCreate 
    preview = (SurfaceView) findViewById(R.id.cameraplacer); 
    previewHolder = preview.getHolder(); 

    previewHolder.addCallback(surfaceCallback); 
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

// này nằm ngoài các phương pháp vòng đời

SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() { 
    public void surfaceCreated(SurfaceHolder holder) { 
     if (camera == null) { 
      camera = Camera.open(); 
      try { 
       Camera.Parameters camParams = camera.getParameters(); 
       camParams.setFlashMode(Parameters.FLASH_MODE_AUTO); 

       setDisplayOrientation(camera, 90); 
       camera.setPreviewDisplay(previewHolder); 
       camera.setParameters(camParams); 

      } catch (IOException e) { 
       camera.release(); 
       camera = null; 
      } 
     } 


    }//end surfaceCreated 

    public void surfaceChanged(SurfaceHolder holder, 
      int format, int width, 
      int height) { 
     Camera.Parameters parameters=camera.getParameters(); 
     Camera.Size size=getBestPreviewSize(width, height, 
       parameters); 

     if (size!=null) { 
      parameters.setPreviewSize(size.width, size.height); 
      camera.setParameters(parameters); 
      camera.startPreview(); 
      inPreview=true; 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     if (camera != null) { 
      camera.stopPreview(); 
      camera.setPreviewCallback(null); 
      camera.release(); 
      camera = null; 
     } 
    } 
};//end CallBack 

private Camera.Size getBestPreviewSize(int width, int height, 
     Camera.Parameters parameters) { 
    Camera.Size result=null; 

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) { 
     if (size.width<=width && size.height<=height) { 
      if (result==null) { 
       result=size; 
      } 
      else { 
       int resultArea=result.width*result.height; 
       int newArea=size.width*size.height; 

       if (newArea>resultArea) { 
        result=size; 
       } 
      } 
     } 
    } 

    return(result); 
}//end getBestPreviewSize 

// đây là trên OnResume

 try { 
     //Method rotateMethod = android.hardware.Camera.class.getMethod("setDisplayOrientation", int.class); 
     //rotateMethod.invoke(camera, 90); 
     //Camera.Parameters camParams = camera.getParameters(); 
     //camParams.setPreviewSize(480, 320);// here w h are reversed 
     //camera.setParameters(camParams);*/ 
     //setCameraDisplayOrientation(MainPhoto.this, 0, camera); 
     if(camera!=null) 
     { 
      Camera.Parameters camParams = camera.getParameters(); 
      camParams.setFlashMode(Parameters.FLASH_MODE_AUTO); 
      camera.setParameters(camParams); 
      setDisplayOrientation(camera, 90); 
      camera.setPreviewDisplay(previewHolder); 
      camera.startPreview(); 
     } 


    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }/* catch (NoSuchMethodException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }*/ catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }/* catch (IllegalAccessException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }*/ 
+0

Nếu không có thông báo nhật ký và bảng điều khiển bạn đang nhận được, tôi không nghĩ nhiều người có thể giúp bạn về điều này. –

Trả lời

4

Tôi muốn xóa logic onResume(), vì nó trùng lặp những gì bạn có trong surfaceChanged() và có thể không an toàn để thực hiện công việc đó vào thời điểm onResume() được gọi, vì bề mặt có thể chưa sẵn sàng.

Ngoài ra, bạn đang yêu cầu một cách mù quáng FLASH_MODE_AUTO mà không cần xem thiết bị có được hỗ trợ hay không.

Đó sẽ là hai nơi để bắt đầu.

+0

làm cách nào để kiểm tra chế độ flash tự động. Tôi nghĩ rằng cuộc gọi đã làm kiểm tra trên của riêng mình vì nó là một biến hardcoded – CQM

+0

@CQM: Gọi 'getSupportedFlashModes()' và xem nó có nằm trong danh sách hay không. Tôi không biết điều gì xảy ra nếu bạn yêu cầu một chế độ không được hỗ trợ. – CommonsWare

+0

cảm ơn! Tôi có một tuyên bố có điều kiện từ đó. 'onResume' đã biến mất và chế độ flash được kiểm tra tùy ý. Điều này vẫn không hiển thị bất cứ thứ gì từ máy ảnh trên 2,2 thiết bị.Tôi sẽ chỉ tăng mức sdk tối thiểu lên 10 ngay bây giờ, vì vậy ít nhất tất cả người dùng có thể cài đặt nó sẽ nhận được trải nghiệm phù hợp – CQM

4

trước tiên là câu hỏi ở đâu là phương thức onPause của bạn, tôi giả định bạn đang phát hành tất cả các tài nguyên liên quan đến máy ảnh, vì bạn không thể giữ lại cho đến khi ứng dụng của bạn bị tạm dừng.

thứ hai, có biến để theo dõi trạng thái bề mặt cho dù trạng thái bị phá hủy hay không dựa trên đó bạn phải quyết định việc cần làm trong onResume. Một số điều như thế này

if (hasSurface) { 
      // The activity was paused but not stopped, so the surface still 
      // exists. Therefore 
      // surfaceCreated() won't be called, so init the camera here. 
      initCamera(surfaceHolder); 
     } else { 
      surfaceHolder.addCallback(this); 
      surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     } 

một điều nữa lỗi 100 bạn đang nhận được thực sự là camera cho thấy ứng dụng máy ảnh tự nhiên là bị rơi bằng cách nào đó, nếu bạn đã thiết lập các errorCallback đến dụ camera bạn sẽ được thông báo lại về sự kiện này và những gì bạn có thể làm theo các tài liệu lỗi là bắt đầu tươi ví dụ như tái khởi động máy ảnh dụ.

hy vọng nó sẽ giúp bằng cách nào đó!

2

Hãy xem ví dụ android here

hoặc nhập khẩu các ví dụ android trong IDE của bạn.

Hy vọng điều này sẽ giúp

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