Skip to content

Commit 8b21edd

Browse files
author
luowei
committed
Added callbacks to allow selection of preview and picture sizes
1 parent fe4d7c3 commit 8b21edd

File tree

6 files changed

+127
-25
lines changed

6 files changed

+127
-25
lines changed

demo/src/main/java/com/google/android/cameraview/demo/MainActivity.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@
4444
import android.view.View;
4545
import android.widget.ImageView;
4646
import android.widget.Toast;
47-
4847
import com.google.android.cameraview.AspectRatio;
4948
import com.google.android.cameraview.CameraView;
50-
49+
import com.google.android.cameraview.Size;
50+
import com.google.android.cameraview.SizeMap;
5151
import java.io.File;
5252
import java.io.FileOutputStream;
5353
import java.io.IOException;
@@ -280,6 +280,11 @@ public void onCameraClosed(CameraView cameraView) {
280280
mIsOpen = false;
281281
}
282282

283+
@Override
284+
public void onCameraNotAvailable(CameraView cameraView) {
285+
super.onCameraNotAvailable(cameraView);
286+
}
287+
283288
@Override
284289
public void onCameraConfigured(CameraView cameraView) {
285290
super.onCameraConfigured(cameraView);
@@ -322,6 +327,24 @@ public void run() {
322327
});
323328
}
324329

330+
@Override
331+
public void onTakePictureFailed(CameraView cameraView, Throwable throwable) {
332+
super.onTakePictureFailed(cameraView, throwable);
333+
}
334+
335+
@Override
336+
public Size onChoosePreviewSize(CameraView cameraView, SizeMap availableSizes, Size suggestedSize, AspectRatio aspectRatio) {
337+
// return super.onChoosePreviewSize(cameraView, availableSizes, suggestedSize, aspectRatio);
338+
int width = 1080;
339+
return new Size(width, width * aspectRatio.getX() / aspectRatio.getY());
340+
}
341+
342+
@Override
343+
public Size onChoosePictureSize(CameraView cameraView, SizeMap availableSizes, AspectRatio aspectRatio) {
344+
// return super.onChoosePictureSize(cameraView, availableSizes, aspectRatio);
345+
int width = 500;
346+
return new Size(width, width * aspectRatio.getX() / aspectRatio.getY());
347+
}
325348
};
326349

327350
public static class ConfirmationDialogFragment extends DialogFragment {

library/src/main/api14/com/google/android/cameraview/Camera1.java

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -343,29 +343,39 @@ void adjustCameraParameters() {
343343
mAspectRatio = chooseAspectRatio();
344344
sizes = mPreviewSizes.sizes(mAspectRatio);
345345
}
346-
Size size = chooseOptimalSize(sizes);
346+
Size previewSize = chooseOptimalSize(sizes);
347+
if (mCallback != null) {
348+
previewSize = mCallback.onChoosePreviewSize(mPreviewSizes, previewSize, mAspectRatio);
349+
}
350+
final Camera.Size currentSize = mCameraParameters.getPictureSize();
351+
if (currentSize.width != previewSize.getWidth() ||
352+
currentSize.height != previewSize.getHeight()) {
353+
Size pictureSize;
354+
if (mPictureSizes.sizes(mAspectRatio) == null) {
355+
pictureSize = previewSize;
356+
} else {
357+
// Largest picture size in this ratio
358+
pictureSize = mPictureSizes.sizes(mAspectRatio).last();
359+
}
347360

348-
final Size pictureSize;
349-
if (mPictureSizes.sizes(mAspectRatio) == null) {
350-
pictureSize = size;
351-
} else {
352-
// Largest picture size in this ratio
353-
pictureSize = mPictureSizes.sizes(mAspectRatio).last();
354-
}
361+
if (mCallback != null) {
362+
pictureSize = mCallback.onChoosePictureSize(mPictureSizes, mAspectRatio);
363+
}
355364

356-
if (mShowingPreview) {
357-
mCamera.stopPreview();
358-
}
365+
if (mShowingPreview) {
366+
mCamera.stopPreview();
367+
}
359368

360-
// Always re-apply camera parameters
361-
mCameraParameters.setPreviewSize(size.getWidth(), size.getHeight());
362-
mCameraParameters.setPictureSize(pictureSize.getWidth(), pictureSize.getHeight());
363-
mCameraParameters.setRotation(calcCameraRotation(mDisplayOrientation));
364-
setAutoFocusInternal(mAutoFocus);
365-
setFlashInternal(mFlash);
366-
mCamera.setParameters(mCameraParameters);
367-
if (mShowingPreview) {
368-
mCamera.startPreview();
369+
// Always re-apply camera parameters
370+
mCameraParameters.setPreviewSize(previewSize.getWidth(), previewSize.getHeight());
371+
mCameraParameters.setPictureSize(pictureSize.getWidth(), pictureSize.getHeight());
372+
mCameraParameters.setRotation(calcCameraRotation(mDisplayOrientation));
373+
setAutoFocusInternal(mAutoFocus);
374+
setFlashInternal(mFlash);
375+
mCamera.setParameters(mCameraParameters);
376+
if (mShowingPreview) {
377+
mCamera.startPreview();
378+
}
369379
}
370380
}
371381

library/src/main/api21/com/google/android/cameraview/Camera2.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -465,8 +465,11 @@ private void prepareImageReader() {
465465
if (mImageReader != null) {
466466
mImageReader.close();
467467
}
468-
Size largest = mPictureSizes.sizes(mAspectRatio).last();
469-
mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(),
468+
Size selectedSize = mPictureSizes.sizes(mAspectRatio).last();
469+
if (mCallback != null) {
470+
selectedSize = mCallback.onChoosePictureSize(mPictureSizes, mAspectRatio);
471+
}
472+
mImageReader = ImageReader.newInstance(selectedSize.getWidth(), selectedSize.getHeight(),
470473
ImageFormat.JPEG, /* maxImages */ 2);
471474
mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, null);
472475
}
@@ -497,6 +500,9 @@ void startCaptureSession() {
497500
return;
498501
}
499502
Size previewSize = chooseOptimalSize();
503+
if (mCallback != null) {
504+
previewSize = mCallback.onChoosePreviewSize(mPictureSizes, previewSize, mAspectRatio);
505+
}
500506
mPreview.setBufferSize(previewSize.getWidth(), previewSize.getHeight());
501507
Surface surface = mPreview.getSurface();
502508
try {

library/src/main/base/com/google/android/cameraview/CameraViewImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ interface Callback {
8282
void onPictureTaken(byte[] data);
8383

8484
void onTakePictureFailed(Throwable throwable);
85+
86+
Size onChoosePreviewSize(SizeMap availableSizes, Size suggestedSize, AspectRatio aspectRatio);
87+
88+
Size onChoosePictureSize(SizeMap availableSizes, AspectRatio aspectRatio);
8589
}
8690

8791
}

library/src/main/base/com/google/android/cameraview/SizeMap.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
/**
2626
* A collection class that automatically groups {@link Size}s by their {@link AspectRatio}s.
2727
*/
28-
class SizeMap {
28+
public class SizeMap {
2929

3030
private final ArrayMap<AspectRatio, SortedSet<Size>> mRatios = new ArrayMap<>();
3131

library/src/main/java/com/google/android/cameraview/CameraView.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,36 @@ public void onTakePictureFailed(Throwable throwable) {
477477
}
478478
}
479479

480+
@Override
481+
public Size onChoosePreviewSize(SizeMap availableSizes, Size suggestedSize, AspectRatio aspectRatio) {
482+
for (Callback callback : mCallbacks) {
483+
Size previewSize = callback.onChoosePreviewSize(CameraView.this, availableSizes,
484+
suggestedSize, aspectRatio);
485+
486+
// Take first non-null answer
487+
if (previewSize != null) {
488+
return previewSize;
489+
}
490+
}
491+
return suggestedSize;
492+
}
493+
494+
@Override
495+
public Size onChoosePictureSize(SizeMap availableSizes, AspectRatio aspectRatio) {
496+
for (Callback callback : mCallbacks) {
497+
Size pictureSize = callback.onChoosePictureSize(CameraView.this, availableSizes,
498+
aspectRatio);
499+
500+
// Take first non-null answer
501+
if (pictureSize != null) {
502+
return pictureSize;
503+
}
504+
}
505+
506+
// Nobody stepped up, selected biggest size in that ratio
507+
return availableSizes.sizes(aspectRatio).last();
508+
}
509+
480510
public void reserveRequestLayoutOnOpen() {
481511
mRequestLayoutOnOpen = true;
482512
}
@@ -589,6 +619,35 @@ public void onPictureTaken(CameraView cameraView, byte[] data) {
589619
*/
590620
public void onTakePictureFailed(CameraView cameraView, Throwable throwable) {
591621
}
622+
623+
/**
624+
* Called when determining what size of preview to use
625+
*
626+
* @param cameraView The associated {@link CameraView}.
627+
* @param availableSizes A SizeMap of available sizes grouped by aspect ratio
628+
* @param suggestedSize The default suggested size based on surface
629+
* @param aspectRatio The aspect ratio specified to the CameraView
630+
* @return The desired preview size, or null for default
631+
* (highest res of that aspect ratio)
632+
*/
633+
public Size onChoosePreviewSize(CameraView cameraView, SizeMap availableSizes,
634+
Size suggestedSize, AspectRatio aspectRatio) {
635+
return suggestedSize;
636+
}
637+
638+
/**
639+
* Called when determining what size of picture to use
640+
*
641+
* @param cameraView The associated {@link CameraView}.
642+
* @param availableSizes A SizeMap of available sizes grouped by aspect ratio
643+
* @param aspectRatio The aspect ratio specified to the CameraView
644+
* @return The desired picture size, or null for default
645+
* (highest res of that aspect ratio)
646+
*/
647+
public Size onChoosePictureSize(CameraView cameraView, SizeMap availableSizes,
648+
AspectRatio aspectRatio) {
649+
return null;
650+
}
592651
}
593652

594653
}

0 commit comments

Comments
 (0)