2013-02-11 10 views
6

Stworzyliśmy niestandardową kamerę opartą na klasie android.hardware.Camera. Po naciśnięciu przycisku "rób zdjęcie" oczekiwane zachowanie polega na zrobieniu zdjęcia i wyświetleniu zrobionego zdjęcia na ekranie recenzji. ALE aparat nadal działa/wizjer pokazuje "na żywo" ujęcie (zamiast wciąż przeglądu), gdy dojdziemy do ekranu przeglądu. Wygląda na to, że uchwyt nie działa.S3 (GT-I9300) Uchwyt kamery podglądu błędu

Zostało to zaobserwowane na niektórych telefonach Samsung Galaxy S3 (GT-I9300); ale dziwnie we wszystkich innych modelach wszystko działa dobrze (nieruchomy obraz pojawia się na ekranie recenzji tak, jak powinien).

+1

Mam również ten problem. Czy kiedykolwiek znalazłeś rozwiązanie? – BoredAndroidDeveloper

+0

Nadal nie. :( – GeX

+0

Ten problem występuje w tej aplikacji, jeśli ktoś potrzebuje przykładu kodu: https://github.com/dawidgatti/dgCam – BoredAndroidDeveloper

Odpowiedz

3

Moim rozwiązaniem do tej pory jest stworzenie układu, w którym widok zajmuje taki sam widok, jak widok powierzchni.

Potem dostać widoku granic dla podglądu (w moim przypadku jest to wielkość ekranu)

//Get our screen size 
    Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)) 
      .getDefaultDisplay(); 
    DisplayMetrics metrics = getResources().getDisplayMetrics(); 
    Point size = new Point(); 
    try { 
     display.getSize(size); 
     w_width = size.x; 
     w_height = size.y; 
    } catch (NoSuchMethodError e) { 
     w_width = display.getWidth(); 
     w_height = display.getHeight(); 
    } 

Potem ustawić zwrotnego być:

callback = new Camera.PictureCallback() { 
      @Override 
      public void onPictureTaken(byte[] bytes, Camera camera) { 
       //Get the view bounds to determine how to manipulate this image 
       BitmapFactory.Options options = new BitmapFactory.Options(); 
       options.inJustDecodeBounds = true; 
       BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options); 

       //If the image is smaller than the screen, don't make the image bigger 
       int finalWidth = (w_width < options.outWidth) ? w_width : options.outWidth; 
       int finalHeight = (w_height < options.outHeight) ? w_height : options.outHeight; 
       int inSampleSize = 1; 
       options = new BitmapFactory.Options(); 
       if (finalHeight > w_height || finalWidth > w_width) { 

        // Calculate ratios of height and width to requested height and width 
        final int heightRatio = Math.round((float) finalHeight/(float) w_height); 
        final int widthRatio = Math.round((float) finalWidth/(float) w_width); 

        // Choose the smallest ratio as inSampleSize value, this will guarantee 
        // a final image with both dimensions larger than or equal to the 
        // requested height and width. 
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 
       } 

       options.inSampleSize = inSampleSize; 

       //Decode the smaller image 
       Bitmap b = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options); 

       //Rotate the image correctly 
       Matrix mat = new Matrix(); 
       mat.postRotate(orientation); 
       Bitmap newBitmap = Bitmap.createBitmap(b, 0, 0, options.outWidth, options.outHeight, mat, true); 
       imagePreview.setBackgroundDrawable(new BitmapDrawable(newBitmap)); 
       imagePreview.setVisibility(View.VISIBLE); 
      } 
     }; 

Więc w zasadzie powierzchnia widok nigdy nie przestaje wyświetlać podglądu, ale widok obrazu ukrywa go, aby użytkownik go nie widział.

Następnie, jeśli użytkownik zdecyduje się nie przechowywać obrazu, po prostu ponownie ukryję widok, a surfaceView będzie nadal pokazywał podgląd na żywo. Na szczęście GS3 nie przeszkadza komuś wywołując "camera.startPreview();" nawet gdy podgląd już się dzieje.

Naprawdę nie podoba mi się ta odpowiedź, ale to wszystko, co mam w tej chwili, działa na galaktyce S3. Pracował na starszych urządzeniach (2.3 i nowsze), które wypróbowałem, ale z pewnością jest to tylko obejście.