Функция startPreview медленная, любая работа вокруг?

Проблема:

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

Предварительный просмотр кода:

Это необходимая часть кода (связанная с проблемой).

PreviewGoogle Class (предварительный просмотр): в начале приложения вызывается функция surfaceChanged, я установил некоторые параметры камеры, а затем вызвал startPreview

public class PreviewGoogle extends ViewGroup implements SurfaceHolder.Callback { private final String TAG = "myapp1"; Camera mCamera; public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { try { // Now that the size is known, set up the camera parameters and begin // the preview. Camera.Parameters parameters = mCamera.getParameters(); parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY); parameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO); parameters.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO); parameters.setJpegQuality(100); parameters.setPictureSize(Globals.CAMERA_WIDTH, Globals.CAMERA_HEIGHT); requestLayout(); mCamera.setParameters(parameters); long before = System.currentTimeMillis(); mCamera.startPreview(); long after = System.currentTimeMillis(); Log.d(TAG, "PreviewGoogle, surfaceChanged: startPreview took " + (after - before) + " ms"); } catch (Exception e) { Log.d(TAG, "PreviewGoogle, surfaceChanged: " + e.getMessage()); } } } 

Класс PhotoShootActivity: в этом классе я вызвал startPreview на rawImageCallback, потому что я использую BitmapFactory в jpegCallback (не обязательно)

 public class PhotoShootActivity extends Activity { private static final String TAG = "myapp1"; PreviewGoogle preview; // Handles data for raw picture PictureCallback rawCallback = new PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { try { long before = System.currentTimeMillis(); preview.getCamera().startPreview(); long after = System.currentTimeMillis(); Log.d(PhotoShootActivity.TAG, "PhotoShootActivity, rawCallback: preview started in " + (after - before) + " ms"); } catch(Exception e) { Log.e(TAG, "PhotoShootActivity, rawCallback: " + e.getMessage()); } } }; } 

Номера таймеров были такими:

 09-09 10:58:42.336: DEBUG/myapp1(21958): PhotoShootActivity, onCreate **09-09 10:58:44.396: DEBUG/myapp1(21958): PreviewGoogle, surfaceChanged: startPreview took 1457 ms** 09-09 10:58:48.438: DEBUG/myapp1(21958): PhotoShootActivity, buttonCapture: Picture taken in 65ms 09-09 10:58:48.496: DEBUG/myapp1(21958): PhotoShootActivity, shutterCallback: Empty **09-09 10:58:49.790: DEBUG/myapp1(21958): PhotoShootActivity, rawCallback: preview started in 662 ms** 

Первый startPreview занял ~ 1500 мс, а второй занял 662 мс !!!

Искаженное решение:

Вопрос, который я ищу, – это не полный код (просто подскажите мне :)), я подумал, что в предварительном просмотре я могу что-то пропустить, и я думал об использовании потоков в этом случае, но я не знаком с android -sdk еще (я начал с программирования Android 4 дня назад)

С уважением…

Из андроидных документов:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

startPreview()

Начинает захватывать и рисовать кадры предварительного просмотра на экране. Предварительный просмотр на самом деле не начинается до тех пор, пока поверхность не будет снабжена установкой setPreviewDisplay(SurfaceHolder) или setPreviewTexture(SurfaceTexture) .

Если были setPreviewCallback(Camera.PreviewCallback) , setOneShotPreviewCallback(Camera.PreviewCallback) или setPreviewCallbackWithBuffer(Camera.PreviewCallback) , onPreviewFrame(byte[], Camera) когда данные предварительного просмотра становятся доступными.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Итак, в своем комментарии вы сказали, что решили использовать onPreviewFrame(byte[], Camera) , как вы можете видеть в документах, он говорит, что он вызывается только тогда, когда данные предварительного просмотра становятся доступными, что требует определенного времени. Попробуйте добавить первый вариант, предоставив камеру текстуру или предварительный просмотр.

surfaceChanged(SurfaceHolder holder, int format, int w, int h) есть, в вашем surfaceChanged(SurfaceHolder holder, int format, int w, int h) :

 mCamera.setPreviewDisplay(holder); 

Посмотрите, если это имеет значение.