Невидимый SurfaceView для предварительного просмотра камеры

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

Я использовал код из этого ответа: https://stackoverflow.com/a/10268650/1395697

Однако с TYPE_SYSTEM_OVERLAY это не сработало. Он был невидим, но данные предварительного просмотра не были получены (в onPreviewFrame()). Когда я изменяю этот аргумент на 0, я получаю данные предварительного просмотра, но SurfaceView виден.

Знаете ли вы какой-либо другой способ сделать это?

Что я сделал сейчас, так это просто сделал видимым SurfaceView с шириной и высотой 1, а затем создал наложение ImageView с определенным цветом, чтобы вы не видели изменение цвета SurfaceView. Но это совсем не аккуратно, и я действительно хотел бы сделать это немного лучше.


person DominicM    schedule 09.06.2012    source источник
comment
См. stackoverflow.com/questions/22462360.   -  person fadden    schedule 19.02.2015


Ответы (2)


я также использовал тот же ответ stackOverflow и получил ту же проблему.

я добавил этот код

this.setZOrderOnTop(true);
SurfaceHolder h = this.getHolder();
h.setFormat(PixelFormat.TRANSPARENT);

к моему методу surfaceChanged вместо активности (или службы в моем случае) и получил его прозрачным, но журнал жалуется на заброшенные кадры :(

person Arkady    schedule 20.06.2013

На самом деле вам вообще не нужно размещать SurfaceView в своем пользовательском интерфейсе. Мы столкнулись с той же проблемой и сделали фиктивный SurfaceView. Вот наш код:

SurfaceView dummy = new SurfaceView(c);
try {
    mCamera.setPreviewDisplay(dummy.getHolder());
} catch (IOException e) {

}
mCamera.setPreviewCallback(this);
mCamera.startPreview();
person Zaid Daghestani    schedule 09.06.2012
comment
Вот и я тоже подумал. На большинстве устройств он работает даже без предварительного просмотра, поэтому ваш метод, очевидно, работает и на этих устройствах. Однако на некоторых устройствах, таких как HTC One X или Google Nexus One, он не работает ни без SurfaceView, ни с вашим методом. - person DominicM; 09.06.2012
comment
Святое дерьмо. Спасибо за решение нашей проблемы. У нас не было ни того, ни другого для проверки, поэтому мы понятия не имели, что происходит. Очень признателен! :D - person Zaid Daghestani; 09.06.2012
comment
У меня тоже не было ни одного из них, чтобы протестировать его, но я получил несколько отчетов об ошибках, поэтому я выпустил обновление с вашим методом и спросил их, работает ли он сейчас, и это все еще не работает. С новым обновлением это, наконец, сработало (с методом в моем вопросе), но я все же хотел бы улучшить его, так как мой метод действительно ужасен, я думаю... - person DominicM; 09.06.2012
comment
Хм, да, я изучал это, и единственный метод, который, казалось, работал, был нашим, но, видимо, это только на некоторых устройствах. Интересно, есть ли способ использовать этот метод на устройствах, на которых он работает, и другой метод на устройствах, на которых он не работает. - person Zaid Daghestani; 09.06.2012