Android делает снимок и сохраняет его в виде байтового массива - PullRequest
1 голос
/ 16 марта 2011

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

    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" />

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

Последний параметр в 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" />  

есть следующие строки:1012 *

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, указанными выше.

1 голос
/ 05 мая 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...