Я пытаюсь сделать снимок, ничего не показывая пользователю (без просмотра) через службу. Этот вопрос задавался несколько раз, и я просмотрел все, что мог найти. Некоторые похожие вопросы:
Большинство вопросов связаны с другими вопросами, не предлагая нового решения.
Я считаю, что это лучший способ решить эту проблему: https://stackoverflow.com/a/10268650/3860594 К сожалению человек не дал полного ответа, и у меня возникли проблемы с воспроизведением его метода.
Я пытаюсь создать SurfaceView внутри SurfaceHolder. Затем я буду использовать WindowManager с SurfaceView для создания своего рода плавающего окна, которое будет полностью прозрачным, чтобы оно было скрыто от пользователя. Пожалуйста, поправьте меня, если я ошибаюсь.
Вот мой код:
SurfaceView mview = new SurfaceView(this);
SurfaceHolder mholder = new SurfaceHolder() {
@Override
public void addCallback(Callback callback) {
}
@Override
public void removeCallback(Callback callback) {
}
@Override
public boolean isCreating() {
return false;
}
@Override
public void setType(int type) {
}
@Override
public void setFixedSize(int width, int height) {
}
@Override
public void setSizeFromLayout() {
}
@Override
public void setFormat(int format) {
}
@Override
public void setKeepScreenOn(boolean screenOn) {
}
@Override
public Canvas lockCanvas() {
return null;
}
@Override
public Canvas lockCanvas(Rect dirty) {
return null;
}
@Override
public void unlockCanvasAndPost(Canvas canvas) {
}
@Override
public Rect getSurfaceFrame() {
return null;
}
@Override
public Surface getSurface() {
return null;
}
};
WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
wm.addView(mview, params);
mview.setZOrderOnTop(true);
mholder.setFormat(PixelFormat.TRANSPARENT);
try {
camera.setPreviewDisplay(mview.getHolder());
camera.startPreview();
camera.takePicture(null,null,photoCallback);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Ничто из этого не работает, так как отображается обычное сообщение RuntimeException: takePicture failed
. Любая помощь будет потрясающей, спасибо.
takePicture failed
раньше. Разве эта авария не отличается? - person Alex Cohn   schedule 25.09.2015surfaceCreated()
. - person Alex Cohn   schedule 25.09.2015mholder
используется только в этом фрагменте кода в моем приложении. Кажется, mholder на самом деле не делает ничего полезного :/ Кроме того, как я могу дождаться обратного вызова, созданного поверхностью? (поиск в гугле не помог) спасибо - person john   schedule 26.09.2015SystemClock.sleep(20000);
прямо передtakePicture
, и на этот раз экран телефона на секунду стал черным прямо перед тем, как приложение вылетело из строя. Хотя такая же ошибка. - person john   schedule 26.09.2015I/Choreographer﹕ Skipped 395 frames! The application may be doing too much work on its main thread. W/InputEventReceiver﹕ Attempted to finish an input event but the input event receiver has already been disposed.
- person john   schedule 27.09.2015camera
, вы можете увидеть это на этом снимке экрана: i.imgur.com/F5sXvgI .png - person john   schedule 27.09.2015onCreate()
. ПопробуйтеonStart()
- у меня работает! - person Alex Cohn   schedule 28.09.2015takePicture
запускается из методаonStartCommand
сервиса. Может быть, вы можете загрузить свой проект в виде zip-файла, чтобы я мог взглянуть? Спасибо - person john   schedule 01.10.2015camera.takePicture
для захвата изображения. Превью загружается отлично. - person john   schedule 01.10.2015