Я создаю камеру SurfaceView для захвата изображения с помощью API камеры. Коды работают нормально на большинстве устройств. Тем не менее, в устройстве Xiaomi, особенно Xiaomi Mi A1. Вот проблемы, с которыми я столкнулся с Mi A1:
- Экран предварительного просмотра показывает моно chrome предварительный просмотр;
- Неправильный размер изображения, возвращаемого устройством (320 * 240).
Ниже приведен снимок моего кода:
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
if (mCamera != null) {
setCameraDisplayOrientation();
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
if(mCamera != null) {
try{
Camera.Parameters parameters = mCamera.getParameters();
mCamera.setPreviewDisplay(surfaceHolder);
parameters.setFocusMode(parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
parameters.setColorEffect(Camera.Parameters.EFFECT_NONE);
parameters.setZoom(0);
List<Size> supportPictureSizes = parameters.getSupportedPictureSizes();
parameters.setPictureSize(supportPictureSizes.get(0).width,supportPictureSizes.get(0).height);
requestLayout();
mCamera.setParameters(parameters);
mCamera.startPreview();
isSafeToTakePhoto = true;
previewing = true;
setCameraDisplayOrientation();
}catch (Exception e){
e.printStackTrace();
}
}
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
// Surface will be destroyed when we return, so stop the preview
surfaceHolder.removeCallback(this);
if (mCamera != null){
mCamera.stopPreview();
}
previewing = false;
}
Кроме того то, что метод ниже использует для расчета оптимального размера предварительного просмотра:
private Camera.Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) w / h;
if (sizes == null) return null;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
// Try to find an size match aspect ratio and size
for (Camera.Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
// Cannot find the one match the aspect ratio, ignore the requirement
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
Чтобы исправить моно chrome предварительного просмотра, я добавил parameters.setColorEffect(Camera.Parameters.EFFECT_NONE);
, но это ничего не влияет.
Я также подозреваю, что причиной root могут быть проблемы с разрешениями, в которых устройство Xiaomi имеет конфигурацию, отличную от конфигурации другого производителя.
Я с нетерпением жду решения и обсуждения для решения вышеуказанных вопросов. Заранее спасибо.