Android-камера не может сделать фото из фонового сервиса
Я реализовал сервис, позволяющий делать снимки из фонового потока, но фотография никогда не будет получена ни на одном из моих устройств... вот код (регистрация выходных данных ниже):
public class PhotoCaptureService extends Service {
private static final String TAG = "PhotoCaptureService";
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.d(TAG, "Starting the PhotoCaptureService");
takePhoto();
}
private void takePhoto() {
Log.d(TAG, "Preparing to take photo");
Camera camera = null;
try {
camera = Camera.open();
} catch (RuntimeException e) {
Log.e(TAG, "Camera not available", e);
return;
}
if (null == camera) {
Log.e(TAG, "Could not get camera instance");
return;
}
Log.d(TAG, "Got the camera, creating the dummy surface texture");
SurfaceTexture dummySurfaceTexture = new SurfaceTexture(0);
try {
camera.setPreviewTexture(dummySurfaceTexture);
} catch (Exception e) {
Log.e(TAG, "Could not set the surface preview texture", e);
}
Log.d(TAG, "Preview texture set, starting preview");
camera.startPreview();
Log.d(TAG, "Preview started");
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.d(TAG, "Photo taken, stopping preview");
camera.stopPreview();
Log.d(TAG, "Preview stopped, releasing camera");
camera.release();
Log.d(TAG, "Camera released");
}
});
}
Регистрация выходных данных:
D/PhotoCaptureService﹕ Starting the PhotoCaptureService
D/PhotoCaptureService﹕ Preparing to take photo
D/PhotoCaptureService﹕ Got the camera, creating the dummy surface texture
D/PhotoCaptureService﹕ Preview texture set, starting preview
D/PhotoCaptureService﹕ Preview started
На этом этапе больше ничего не происходит, метод onPictureTaken никогда не вызывается, и не выдается ошибка или исключение. Кто-нибудь знает, почему это происходит? Я посмотрел все учебные пособия по камерам в Stackru и, похоже, ничего не работает.
1 ответ
Из моего опыта и того, что я прочитал, манекен SurfaceTexture
стратегия не работает на всех телефонах. Попробуйте вместо этого добавить 1x1 пикселей SurfaceView
и запуск предварительного просмотра в SurfaceView.getHolder()
"s onSurfaceCreated
обратный вызов (добавлено через addCallback
).
См. Съемка с камеры без предварительного просмотра для получения дополнительной информации.