@@ -72,6 +72,7 @@ def connect_camera(self,
72
72
self ._name_pipe = []
73
73
self .texture_size = []
74
74
self .rotation = 0
75
+ self .capture_in_progress = False
75
76
76
77
# uniform case
77
78
self .flash_state = default_flash .lower ()
@@ -128,14 +129,25 @@ def connect_camera(self,
128
129
self ._configure_camera (True )
129
130
130
131
# destroy camera
131
- @run_on_ui_thread
132
132
def disconnect_camera (self ):
133
133
self ._deschedule_pipeline ()
134
134
if self ._camera :
135
- self ._camera .unbind_camera ()
136
- self ._camera = None
137
- return self .texture_size
138
-
135
+ if not self .capture_in_progress :
136
+ self .do_disconnect_camera ()
137
+ else :
138
+ self ._disconnect_ev = Clock .schedule_interval (
139
+ self .can_disconnect_camera , 1 / 30 )
140
+
141
+ def can_disconnect_camera (self ,dt ):
142
+ if not self .capture_in_progress :
143
+ self .do_disconnect_camera ()
144
+ Clock .unschedule (self ._disconnect_ev )
145
+
146
+ @run_on_ui_thread
147
+ def do_disconnect_camera (self ):
148
+ self ._camera .unbind_camera ()
149
+ self ._camera = None
150
+
139
151
# configure camera
140
152
def _configure_camera (self , start ):
141
153
self .configure_viewport ()
@@ -188,6 +200,7 @@ def cg_scale(self, touch0, touch1, scale, x, y):
188
200
189
201
def capture_photo (self , location = '' , subdir = '' , name = '' ):
190
202
if self ._camera :
203
+ self .capture_in_progress = True
191
204
self ._set_location (location )
192
205
subdir = self ._default_subdir_android (subdir )
193
206
name = self ._default_file_name (name , '.jpg' )
@@ -197,6 +210,7 @@ def capture_photo(self, location = '', subdir = '', name = ''):
197
210
198
211
def capture_video (self , location = '' , subdir = '' , name = '' ):
199
212
if self ._camera :
213
+ self .capture_in_progress = True
200
214
self ._set_location (location )
201
215
subdir = self ._default_subdir_android (subdir )
202
216
name = self ._default_file_name (name ,'.mp4' )
@@ -248,7 +262,6 @@ def capture_screenshot(self, location = '.', subdir = '', name = ''):
248
262
249
263
250
264
# Select back, front camera
251
- @run_on_ui_thread
252
265
def select_camera (self , facing ):
253
266
facing = facing .lower ()
254
267
if self ._camera :
@@ -261,9 +274,24 @@ def select_camera(self, facing):
261
274
self .facing = 'front'
262
275
else :
263
276
self .facing = 'back'
264
- self ._camera .select_camera (self .facing )
277
+
278
+ if not self .capture_in_progress :
279
+ self .do_select_camera ()
280
+ else :
281
+ self .stop_capture_video ()
282
+ self ._facing_ev = Clock .schedule_interval (
283
+ self .can_select_camera , 1 / 30 )
265
284
return self .facing
266
285
286
+ def can_select_camera (self ,dt ):
287
+ if not self .capture_in_progress :
288
+ self .do_select_camera ()
289
+ Clock .unschedule (self ._facing_ev )
290
+
291
+ @run_on_ui_thread
292
+ def do_select_camera (self ):
293
+ self ._camera .select_camera (self .facing )
294
+
267
295
# Sequence flash : off, on, auto, ...
268
296
def flash (self ):
269
297
if self ._camera :
@@ -493,8 +521,9 @@ def _filename_callback(self, file_id):
493
521
if self ._name_pipe :
494
522
file_id = self ._name_pipe [0 ]
495
523
self ._name_pipe = self ._name_pipe [1 :]
524
+ self .capture_in_progress = False
496
525
if self .callback :
497
- self .callback (file_id )
526
+ self .callback (str ( file_id ) )
498
527
499
528
def _analyze_texture (self ):
500
529
if not self .enable_data and self ._analyze_callback :
0 commit comments