Android делает снимок и сохраняет его в виде массива байтов

У меня есть простой фрагмент кода, но по какой-то причине он не сохраняет данные. Я уверен, что это что-то глупое, но я не могу понять это. Любая помощь будет принята с благодарностью.

    private byte[] picture;

    public void takePicture(){
    Camera camera = Camera.open();
    Camera.Parameters parameters = camera.getParameters();
    parameters.set("camera-id",2);
            camera.setParameters(parameters);
    parameters.set("gps-timestamp", "1233744883");
    camera.setParameters(parameters);
    Log.i("method", "in takePicture()");
    camera.takePicture(null, rawCallback, null);
    camera.release();
}

    PictureCallback rawCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
    // TODO Do something with the image RAW data.
        Log.i("rawcallback", "in rawcallback");
        picture = data;
    }
};

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

У меня также есть эти разрешения

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />

person 4everAStudent    schedule 16.03.2011    source источник


Ответы (2)


Последний параметр в Camera.takePicture() соответствует обратному вызову JPEG. Таким образом, вы должны добавить строку parameters.setPictureFormat(PixelFormat.JPEG); перед вызовом camera.setParameters(). Или используйте camera.takePicture(null, rawCallback, null); вместо этого.

Вы также должны убедиться, что в AndroidManifest.xml есть следующие строки:

 <uses-permission android:name="android.permission.CAMERA" />
 <uses-feature android:name="android.hardware.camera" />  

Из моего комментария:

API для доступа только к камерам, обращенным к шрифту. появился в Android 2.3 (API версии 9). В более ранней версии вы должны использовать специальные методы поставщика. Взгляните на это рабочее решение для Galaxy S:

Camera.Parameters parameters = mCamera.getParameters();
parameters.set("camera-id", 2);
parameters.setPreviewSize(640, 480); // or (800,480) this is supported front camera preview size @ Samsung Galaxy S
mCamera.setParameters(parameters);

Я надеюсь, что это поможет вам. Если нет, попробуйте поиграть с setPreviewSize параметрами выше.

person Idolon    schedule 16.03.2011
comment
Я изменил его на camera.takePicture(null, rawCallback, null); но все равно не повезло. У меня они есть в манифесте, и я также прокомментировал, что это для фронтальной камеры, значит ли это, что мне нужно добавить еще одну функцию/разрешение на использование? - person 4everAStudent; 17.03.2011
comment
API для доступа только к камерам, обращенным к шрифту. появился в Android 2.3. В более ранней версии вы должны использовать специальные методы поставщика. Взгляните на это рабочее решение для Galaxy S. Надеюсь, это поможет вам. Если нет, попробуйте поиграть с parameters.setPreviewSize - person Idolon; 17.03.2011

У меня возникла аналогичная проблема с обратным вызовом JPEG. Его не всегда вызывали после фотографирования. Это может быть связано с тем, что вы слишком рано отпускаете камеру.

Вы должны подождать, пока все ваши обратные вызовы будут возвращены, прежде чем выпускать камеру или выходить из приложения. Класс Camera не является потокобезопасным. Обратные вызовы будут вызываться в потоке событий, из которого был вызван open(int). (см. документ)

Мне удалось вызвать его чаще, уменьшив качество JPEG с помощью функции setJpegQuality(), чтобы получить меньше данных для вычисления. Но лучше дождаться возврата обратных вызовов.

Согласно Документация по коду Android, вам также необходимо передать SurfaceHolder камере и запустить предварительный просмотр, прежде чем делать снимок. Для моей цели я хотел сделать снимок без предварительного просмотра на экране пользователя. Я использовал локальный SurfaceView, но вы можете использовать и другой.

Я предлагаю что-то вроде:

Camera.PictureCallback myPictureCallback_jpeg = new Camera.PictureCallback() {
        public void onPictureTaken(byte[] imageData, Camera c) {
            //save your data
        }
    };

    SurfaceView mySurfaceView = new SurfaceView(this);
    SurfaceHolder mySurfaceHolder = mySurfaceView.getHolder();
    Camera  myCamera = Camera.open();

    try {
        myCamera.setPreviewDisplay(mySurfaceHolder);
    } catch (IOException e) {
        e.printStackTrace();
    }
    Camera.Parameters p = myCamera.getParameters();
    p.setJpegQuality(70);//a value between 1 and 100
    myCamera.setParameters(p);
    myCamera.startPreview();
    myCamera.takePicture(null, null, null, myPictureCallback_jpeg);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    myCamera.release();
person aRx    schedule 05.05.2011