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.
Mam również ten problem. Czy kiedykolwiek znalazłeś rozwiązanie? – BoredAndroidDeveloper
Nadal nie. :( – GeX
Ten problem występuje w tej aplikacji, jeśli ktoś potrzebuje przykładu kodu: https://github.com/dawidgatti/dgCam – BoredAndroidDeveloper