Android-камера зависает после увеличения
У меня есть кастомная камера, которая отлично работает на некоторых устройствах. Он хорошо работает на Samsung Galaxy Gran Duos (samsung-gt i9082, Android 4.2.2), но когда я пытаюсь сделать снимок, который я увеличивал, он зависает, без сбоев, единственный способ выйти - нажать Кнопка назад. Такое бывает только в Samsung Galaxy Gran Duos.
Код, который я использовал для съемки:
Camera.PictureCallback photoCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
try {
} catch (Exception e) {
if (flePicture== null){
Log.d("camera", "Error creating media file, check storage permissions: " +
e.getMessage());
return;
}
}
try {
FileOutputStream fos = new FileOutputStream(flePicture);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.d("camera", "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d("camera", "Error accessing file: " + e.getMessage());
}
}
};
И код, используемый для увеличения:
private void zoomIn() {
if (pblnInPreview) {
Camera.Parameters parameters = camCamera.getParameters();
if ((parameters.getZoom() + 1) < parameters.getMaxZoom()) {
parameters.setZoom(parameters.getZoom() + 1);
camCamera.setParameters(parameters);
}
}
}
LogCat:
04-07 17:21:14.386: E/BrcmCamera(130): processControlBuffer: Corrupt stream error raised by camera - sensor communication failure
4 ответа
Я думаю, вам нужно подтвердить, что ваша камера поддерживает масштабирование, используя camera.isZoomSupported()
тогда, если это поддерживается, вам нужно отменить автофокус с помощью camera.cancelAutoFocus()
для предотвращения искажения изображения. Но это будет работать только в том случае, если ваше устройство действительно поддерживает масштабирование. Если нет, вам нужно захватить изображение и увеличить его, используя Bitmap.createBitmap
раздел, который вы хотите.
Вы снова запускаете предварительный просмотр камеры после съемки?
Добавь это camera.startPreview();
Попробуй это
Camera.PictureCallback photoCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
camera.startPreview();
try {
} catch (Exception e) {
if (flePicture== null){
Log.d("camera", "Error creating media file, check storage permissions: " +
e.getMessage());
return;
}
}
try {
FileOutputStream fos = new FileOutputStream(flePicture);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.d("camera", "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d("camera", "Error accessing file: " + e.getMessage());
}
}
};
Это не сильно связанный ответ. Я знаю.
Но я бы хотел сказать, что у Samsung 4.2.2 много дефектных проблем. Он имеет сбой ClipboardManager, сбой ActionBar AppCompat и так далее.
Просто отфильтруйте это с простым if
оговорка и спаси свою жизнь.
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR1 && Build.MANUFACTURER.toUpperCase().contains("SAMSUNG")){
// ignore
}else{
// your logic on the go
}
Это проблема с конкретным типом ядра.
Попробуйте этот подход.
private static final String TAG = Test.class.getSimpleName();
private boolean isPreviewStarted;
private Camera camera;
Camera.PictureCallback photoCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
// check if this needs to stop the preview
if (deviceNeedsStopPreviewToShoot()) {
stopPreview();
}
// save your image
// restart preview if needed.
startPreview();
}
};
public void startPreview() {
if (!isPreviewStarted && camera != null) {
camera.startPreview();
isPreviewStarted = true;
}
}
public void stopPreview() {
if (isPreviewStarted && camera != null) {
camera.stopPreview();
isPreviewStarted = false;
}
}
public static boolean deviceNeedsStopPreviewToShoot() {
String[] oldDevices = {"smdk4210", "aries"};
boolean needs = Arrays.asList(oldDevices).contains(Build.BOARD);
Log.e(TAG, "Device " + Build.BOARD + (needs ? " needs " : " doesn't need ") + "to stop preview");
return needs;
}