Хобрук: Ваш путь к мастерству в программировании

Ошибка 1 при наложении камеры в Android

Я создал действие с SurfaceView и SurfaceHolder, чтобы создать наложение камеры. По какой-то причине я получаю в ADB следующее: 04-08 10:54:06.747: E/Camera(1152): ошибка 1. Я могу сделать снимок, но я не могу получить предварительный просмотр. Вот код, который я использую:

public class MyActivity extends Activity implements
    SurfaceHolder.Callback, Camera.ShutterCallback, Camera.PictureCallback, OnClickListener {
private Camera mCamera;
private SurfaceView videoPreview;
private SurfaceHolder surfaceHolder;
private Button cancel;
private Button takePicture;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    setContentView(R.layout.camera_layout);
    videoPreview = (SurfaceView) findViewById(R.id.video_preview);
    cancel = (Button) findViewById(R.id.cancel);
    cancel.setOnClickListener(this);
    takePicture = (Button) findViewById(R.id.take_picture);
    takePicture.setOnClickListener(this);
    surfaceHolder = videoPreview.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    // Camera.open(getNumberOfCameras() - 1); => access front facing camera as well
    mCamera = Camera.open(); 
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    Camera.Parameters parameters = mCamera.getParameters();
    // pick the device's largest supported camera size
    List<Camera.Size> cameraSizes = parameters.getSupportedPreviewSizes();

    // the first size is the largest
    Camera.Size selectedSize = cameraSizes.get(0);

    parameters.setPreviewSize(selectedSize.width, selectedSize.height);

    mCamera.setDisplayOrientation(90);
    mCamera.setParameters(parameters);

    mCamera.startPreview();
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCamera.setPreviewDisplay(surfaceHolder);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

@Override
protected void onPause() {
    super.onPause();
    mCamera.stopPreview();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mCamera.release();
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.cancel:
        finish();
        break;
    case R.id.take_picture:
        mCamera.takePicture(this, null, null, this);
        break;
    }
}

@Override
public void onPictureTaken(byte[] data, Camera camera) {
    // store the picture 
    FileOutputStream fos = null;
    File imageFile = null;
    try {
        imageFile = new File(Environment.getExternalStorageDirectory(), "custom_image1.png");
        fos = new FileOutputStream(imageFile);
        fos.write(data);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fos != null) {
            try {
                fos.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    mCamera.startPreview();
}

@Override
public void onShutter() {
    // perform an animation
}

}

А вот и макет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

<SurfaceView
    android:layout_weight="1"
    android:id="@+id/video_preview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<Button
    android:id="@+id/cancel"
    android:layout_width="100dip"
    android:layout_height="wrap_content"
    android:text="Cancel" /> 

<Button
    android:id="@+id/take_picture"
    android:layout_width="100dip"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:text="Snap Photo" />

</LinearLayout>

Я попытался изменить это на RelativeLayout, но безрезультатно. Я действительно думаю, что я только что пропустил что-то простое. Любая помощь приветствуется. Спасибо!


Ответы:


1

У вас нет метода onResume() для повторного вызова startPreview(), поэтому, когда вы делаете снимок, предварительный просмотр не выполняется, поэтому захват не удается.

Чтобы проверить это, попробуйте добавить camera.startPreview() непосредственно перед захватом изображения и посмотрите, работает ли это.

01.01.2013
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...