La fonction startPreview est lente, tout travail autour?

Problème:

Je fais une application sur Android qui requiert une réponse rapide de la caméra lors du tournage d'images, j'ai remarqué un comportement lent de l'application, après avoir mesuré le temps où j'ai remarqué que la fonction startPreview () est responsable du problème.

  • Comment créer une préférence qui accepte uniquement des valeurs entières
  • Sélecteur d'image Android Sélectionnez plusieurs images de la galerie avec une limite maximale de 5
  • NoSuchMethodError erreur pour getActionBar () (API-8)
  • Liaison des bibliothèques statiques dans android ndk
  • Jsoup.connect () fonctionne avec Java, pas avec Android
  • Comment se déplacer vers le centre de l'enfance de HorizontalScrollView?
  • Aperçu du code:

    C'est la partie nécessaire du code (en rapport avec le problème).

    PreviewGoogle Class (l'aperçu personnalisé): Au début de l'application, on appelle surfaceChanged, j'ai défini certains paramètres de la caméra puis je l'ai appelé 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: Dans cette classe, j'ai appelé le startPreview sur rawImageCallback car j'utilise BitmapFactory dans jpegCallback (chose non nécessaire)

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

    Les numéros de la minuterie étaient comme ceci:

     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** 

    Le premier startPreview a pris ~ 1500ms et le second a pris 662 ms !!!

    Solution recherchée:

    La question que je recherche n'est pas un code complet (il suffit de me suggérer :)), j'ai pensé que je pouvais manquer quelque chose dans l'aperçu, et j'ai pensé à utiliser des threads dans cette affaire, mais je ne suis pas familier avec Android -sdk encore (j'ai commencé avec la programmation Android il y a 4 jours)

    Cordialement…

    One Solution collect form web for “La fonction startPreview est lente, tout travail autour?”

    De l'android docs:

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

    startPreview()

    Commence à capturer et à dessiner des images d'aperçu à l'écran. L'aperçu ne démarre pas avant qu'une surface ne soit fournie avec setPreviewDisplay(SurfaceHolder) ou setPreviewTexture(SurfaceTexture) .

    Si setPreviewCallback(Camera.PreviewCallback) , setOneShotPreviewCallback(Camera.PreviewCallback) , ou setPreviewCallbackWithBuffer(Camera.PreviewCallback) ont été appelés, onPreviewFrame(byte[], Camera) sera appelé lorsque les données d'aperçu seront disponibles.

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

    Donc, dans votre commentaire, vous avez dit que vous avez décidé d'utiliser onPreviewFrame(byte[], Camera) , comme vous pouvez le voir dans les documents, il dit qu'il n'est appelé que lorsque les données d'aperçu sont disponibles, ce qui prend du temps. Essayez d'ajouter la première option en fournissant à la caméra une texture ou un aperçu.

    C'est-à-dire, dans votre surfaceChanged(SurfaceHolder holder, int format, int w, int h) méthode:

     mCamera.setPreviewDisplay(holder); 

    Voyez si cela fait une différence.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.