2011-12-19 4 views
2

Я тестирую свое приложение с помощью HTC Wildfire с Android 2.2.1. Размер предварительного просмотра камеры камеры составляет 768x432. Я вижу это из журнала устройств:Настройка размера предварительного просмотра камеры

12-19 18:41:34.088: D/QualcommCameraHardware(72): initPreview E: preview size=768x432 
12-19 18:41:34.088: D/QualcommCameraHardware(72): initPreview E: preview size=768x432 videosize = 768 x 432 
12-19 18:41:34.088: D/QualcommCameraHardware(72): mBufferSize=497664, mAlignedBufferSize=524288 

ОК, он работает. Но если я попытаюсь изменить размер предварительного просмотра на какое-то другое значение, например 320x240 или 800x480, на экране ничего, кроме путаницы пикселей. Самое интересное в том, что если я использую предварительный просмотр с размером буфера меньше, чем один по умолчанию (497664) я получаю эту ошибку в журнале:

12-19 18:52:49.288: E/Camera-JNI(5776): Manually set buffer was too small! Expected 497664 bytes, but got 144000! 

Так что очевидно, что фактический размер буфера не изменяется , Есть ли способ решить это?

Я хотел бы также заметить, что не существует такой проблемы нет на Asus Eee Pad Transformer с Android 3.2.1

ответ

4

Я выяснил, в чем проблема. Это не кажется, что на Android 2.2.1 вы должны установить параметры камеры, прежде чем вы звоните

camera.startPreview() 

Однако на более поздних системах, таких как Android 3.2.1 это уже не проблема (хотя это может быть конкретным поставщиком).

0

камеры на андроид является своего рода вуду. Я бы порекомендовал посмотреть, который предварительный размеры фактически поддерживаются (ну, по крайней мере, разреклами-):

 Camera.Parameters cameraParameters = camera.getParameters(); 
     // print out parameters 
     Log.d(LOG_TAG, "flash modes:" + cameraParameters.getSupportedFlashModes()); 
     Log.d(LOG_TAG, "autofocus:" + cameraParameters.getSupportedFocusModes()); 
     Log.d(LOG_TAG, "preview formats:" + cameraParameters.getSupportedPreviewFormats()); 
     Log.d(LOG_TAG, "scene modes:" + cameraParameters.getSupportedSceneModes()); 
     Log.d(LOG_TAG, "white balance modes:" + cameraParameters.getSupportedWhiteBalance()); 

К сожалению, не все размеры предварительного просмотра будут quaranted работать, даже если они находятся в этом списке. По крайней мере, не на мотоцикле defy или htc героя. Поэтому я делаю следующее:

  // as we know, that big preview size can produce RE on HTC Hero, 
     // we just iterate through allowed preview sizes until we find something proper 
     // go for maximal allowed preview size 

     previewSize = cameraParameters.getPreviewSize(); 

     if (previewSize.width <= MIN_PREVIEW_WIDTH) { 
      Log.d(LOG_TAG, "preview size is too small:" + previewSize.width + "x" + previewSize.height); 
      final List<Camera.Size> sizes = cameraParameters.getSupportedPreviewSizes(); 
      Collections.sort(sizes, new Comparator<Camera.Size>() { 
       public int compare(Camera.Size o1, Camera.Size o2) { 
        return new Integer(o2.width).compareTo(o1.width); 
       } 
      }); 

      for (Camera.Size size : sizes) { 
       cameraParameters.setPreviewSize(size.width, size.height); 
       camera.setParameters(cameraParameters); 
       Log.d(LOG_TAG, "attempt preview size:" + size.width + "x" + size.height); 
       try { 
        camera.startPreview(); 
        Log.d(LOG_TAG, "...accepted - go along"); 
        // ok, camera accepted out settings. since we know, 
        // that some implementations may choose different preview format, 
        // we retrieve parameters again. just to be sure 
        cameraParameters = camera.getParameters(); 
        break; 
       } catch (RuntimeException rx) { 
        // ups, camera did not like this size 
        Log.d(LOG_TAG, "...barfed, try next"); 
       } 

      } 
     } else { 
      Log.d(LOG_TAG, " accepted default preview size on the spot:" + previewSize.width + "x" + previewSize.height); 
      camera.startPreview(); 
     } 
+0

Я на самом деле с помощью cameraParameters.getSupportedPreviewSizes() – Max

+0

я делаю то же самое - но я получил исключение во время установки, а иногда и на предварительном обратном вызов, если просмотр размер был слишком большой –

0

Моим решения для 2.2 версии:

Camera.PictureCallback photoCallback=new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
mCamera.addCallbackBuffer(data); 
mCamera.startPreview(); 

http://developer.android.com/reference/android/hardware/Camera.html#addCallbackBuffer%28byte[]%29 
     } 
       }; 
Смежные вопросы