Камера не показывает предварительный просмотр в Samsung Galaxy S7
У меня есть приложение с использованием камеры с SurfaceView. Это код для Surface View:
public class CameraView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraView(Context context, Camera camera){
super(context);
mCamera = camera;
mCamera.setDisplayOrientation(90);
//get the holder and set this class as the callback, so we can get camera data here
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
try{
//when the surface is created, we can set the camera to draw images in this surfaceholder
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
} catch (IOException e) {
Log.d("ERROR", "Camera error on surfaceCreated " + e.getMessage());
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) {
//before changing the application orientation, you need to stop the preview, rotate and then start it again
if(mHolder.getSurface() == null)//check if the surface is ready to receive camera data
return;
try{
mCamera.stopPreview();
} catch (Exception e){
//this will happen when you are trying the camera if it's not running
}
//now, recreate the camera preview
try{
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (IOException e) {
Log.d("ERROR", "Camera error on surfaceChanged " + e.getMessage());
} catch (RuntimeException e){
} catch (Exception e){
}
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
//our app has only one screen, so we'll destroy the camera in the surface
//if you are unsing with more screens, please move this code your activity
//mCamera.stopPreview();
//mCamera.release();
}
}
И это код, связанный с камерой в ее деятельности:
public class CameraOverlay extends ActionBarActivity implements CameraLoopsAdapterDelegate {
private Camera mCamera = null;
private CameraView mCameraView = null;
FrameLayout camera_view;
Bitmap bmp = null;
private Camera.PictureCallback mPicture = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Bitmap bmpAux = BitmapFactory.decodeByteArray(data, 0, data.length);
int rotationInDegrees;//PictureUtil.exifToDegrees(rotation);
Log.e("", "CAMERA MODE "+cameraMode+" (back, front)="+ CameraInfo.CAMERA_FACING_BACK+","+CameraInfo.CAMERA_FACING_FRONT);
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_BACK, info);
Log.e("", "CAMERA ORIENTATION "+orientationOnPhoto);
if(cameraMode == Camera.CameraInfo.CAMERA_FACING_BACK) {
if (orientationOnPhoto == Constants.ORIENTATION_PORTRAIT_NORMAL)
rotationInDegrees = 90;
else if (orientationOnPhoto == Constants.ORIENTATION_PORTRAIT_INVERTED)
rotationInDegrees = 270;
else if (orientationOnPhoto == Constants.ORIENTATION_LANDSCAPE_NORMAL)
rotationInDegrees = 0;
else //if (orientationOnPhoto == Constants.ORIENTATION_LANDSCAPE_INVERTED)
rotationInDegrees = 180;
}
else {
if (orientationOnPhoto == Constants.ORIENTATION_PORTRAIT_NORMAL)
rotationInDegrees = 270;
else if (orientationOnPhoto == Constants.ORIENTATION_PORTRAIT_INVERTED)
rotationInDegrees = 90;
else if (orientationOnPhoto == Constants.ORIENTATION_LANDSCAPE_NORMAL)
rotationInDegrees = 0;
else //if (orientationOnPhoto == Constants.ORIENTATION_LANDSCAPE_INVERTED)
rotationInDegrees = 180;
}
Matrix matrix = new Matrix();
//if (rotationInDegrees != 0f)
matrix.preRotate(rotationInDegrees);
bmp = Bitmap.createBitmap(bmpAux, 0, 0, bmpAux.getWidth(), bmpAux.getHeight(), matrix, true);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera_overlay);
getSupportActionBar().hide();
camera_view = (FrameLayout)findViewById(R.id.camera_view);
takePhotoIV = (ImageView)findViewById(R.id.camera_takepicture);
takePhotoIV.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(!PermissionsManager.getInstance(CameraOverlay.this).hasGivenPermission("android.permission.CAMERA"))
return;
orientationOnPhoto = mOrientation;
mCamera.takePicture(null, null, mPicture);
takePhotoIV.setVisibility(View.INVISIBLE);
}
});
sendTV = (TextView)findViewById(R.id.send_photo);
sendTV.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Here we send the photo stored on "bmp" to backend
resetCamera();
}
});
}
public void onResume()
{
super.onResume();
if(PermissionsManager.getInstance(CameraOverlay.this).hasGivenPermission("android.permission.CAMERA"))
{
try {
mCamera = Camera.open(cameraMode);//camera mode is an enumerated to use FRONT or BACK camera
Camera.Parameters parameters = mCamera.getParameters();
parameters.setFlashMode(cameraFlash);
mCamera.setParameters(parameters);
} catch (Exception e) {
Log.d("ERROR", "Failed to get camera: " + e.getMessage());
}
if(mCamera != null) {
mCameraView = new CameraView(this, mCamera);//create a SurfaceView to show camera data
camera_view.addView(mCameraView);//add the SurfaceView to the layout
}
}
}
public void resetCamera()
{
if(!PermissionsManager.getInstance(CameraOverlay.this).hasGivenPermission("android.permission.CAMERA"))
return;
mCamera.stopPreview();
mCamera.release();
camera_view.removeAllViews();
mCamera = Camera.open(cameraMode);
try {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setFlashMode(cameraFlash);
mCamera.setParameters(parameters);
} catch (RuntimeException e) {
Log.d("ERROR", "Error setting parameters: " + e.getMessage());
}
mCameraView = new CameraView(this, mCamera);//create a SurfaceView to show camera data
camera_view.addView(mCameraView);//add the SurfaceView to the layout
}
}
Этот код работает нормально на всех устройствах, которые я тестировал до сих пор:
- Когда пользователь нажимает кнопку "Сделать фото", фотография делается.
- Структура кадра камеры останавливается, показывая сделанную фотографию.
- Когда пользователь нажимает Отправить фото, фотография отправляется на сервер в порядке.
- Камера перезагружена, компоновка кадра не застыла, и камера снова готова сделать снимок.
Теперь некоторые пользователи, у которых есть Samsung Galaxy S7 (android 6), сообщают, что когда они делают фотографию, она не отображается на экране камеры. Структура кадра камеры не останавливается, кажется, что камера все еще ждет, когда пользователь сделает снимок.
Но если пользователь нажимает кнопку "Отправить", фотография отправляется на сервер в порядке, поэтому вызывается PictureCallback и правильно создается растровое изображение bmp. Но почему фотография не была показана на его поверхности?
Я пытался найти любую документацию по этому поводу безуспешно, но есть проблема Samsung Galaxy S7 с android.hardware.camera? Должен ли я использовать Camera2 для этого устройства?