La captura de video de Phonegap se bloquea
He hecho una aplicación de teléfono relativamente simple, con la capacidad de capturar imágenes y videos y subirlos a un servidor.
Las imágenes funcionan bien, sin embargo cuando llamo para capturar video aparece la interfaz de usuario de la cámara y cuando acepto el video, la aplicación se bloquea con este error en logcat:
- Android: cambia entre la cámara frontal y posterior mientras graba un vídeo
- Transmisión de vídeo de la cámara Android al servidor
- Procesamiento de vídeo de Android marco por cuadro durante la grabación
- Captura de video en AR (Vuforia) con unidad en la plataforma Android
- Obtener la URL de descarga para el vídeo de YouTube (Android / Java)
java.lang.RuntimeException: Failure delivering result ResultInfo(who=null, request=2, result=-1, data=Intent { dat=content://media/external/video/media/46536 }} to activity {myApp.test.app}: java.lang.IllegalStateException:Do not perform IO operations on the UI thread. Use CordovaInterface.getThreadPool() instead
Estoy utilizando phonegap 3.0.0, he instalado los complementos correctos a través de la interfaz de línea de comandos, y mi AndroidManifest está bien.
Estoy usando el código de demostración de la API de phonegap, por lo que el problema tampoco existe.
- Rotar vídeo con Mp4parser
- Inconsistencias con el video HTML5 en un WebView de Android
- Android cámara2 api galaxia s7
- Cómo publicar videos grandes en un servidor, en Android?
- HTML5 Lienzo drawImage con fuente de video que no funciona en Android
- Recortar video como whatsapp
- Intención de Android para reproducir vídeo?
- InAppBrowser reproduce video de vimeo en el reproductor de video nativo automáticamente?
Una solución para este problema es editar [yourApp] \ plugins \ org.apache.cordova.media-capture \ src \ android \ Capture.java
A partir de la línea 377, cambie este código
private JSONObject createMediaFile(Uri data) { File fp = webView.getResourceApi().mapUriToFile(data); JSONObject obj = new JSONObject();
Al siguiente código
private JSONObject createMediaFile(Uri data) { // is thread checking enabled? boolean thC = webView.getResourceApi().isThreadCheckingEnabled(); // set thread checking to disabled (this works around mapUriToFile failing with IllegalStateException: Do not perform IO operations on the UI thread. webView.getResourceApi().setThreadCheckingEnabled(false); File fp = webView.getResourceApi().mapUriToFile(data); // set thread checking back to whatever it was before the call above. webView.getResourceApi().setThreadCheckingEnabled(thC); JSONObject obj = new JSONObject();
Esto funcionó para nosotros, espero que se arreglará correctamente pronto.
Creo que una solución mejor sería evitar el uso del subproceso de interfaz de usuario, en lugar de desactivar la comprobación de subprocesos.
Lo resolví así:
private JSONObject createMediaFile(final Uri data) { Future<JSONObject> result = cordova.getThreadPool().submit(new Callable<JSONObject>() { @Override public JSONObject call() throws Exception { File fp = webView.getResourceApi().mapUriToFile(data); JSONObject obj = new JSONObject(); try { // File properties obj.put("name", fp.getName()); obj.put("fullPath", fp.toURI().toString()); // Because of an issue with MimeTypeMap.getMimeTypeFromExtension() all .3gpp files // are reported as video/3gpp. I'm doing this hacky check of the URI to see if it // is stored in the audio or video content store. if (fp.getAbsoluteFile().toString().endsWith(".3gp") || fp.getAbsoluteFile().toString().endsWith(".3gpp")) { if (data.toString().contains("/audio/")) { obj.put("type", AUDIO_3GPP); } else { obj.put("type", VIDEO_3GPP); } } else { obj.put("type", FileHelper.getMimeType(Uri.fromFile(fp), cordova)); } obj.put("lastModifiedDate", fp.lastModified()); obj.put("size", fp.length()); } catch (JSONException e) { // this will never happen e.printStackTrace(); } return obj; } }); try { return result.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } return null;
Envolví el método predeterminado en una clase interna llamable. Ahora se ejecuta en otro hilo.
- Android: cómo establecer visibles visibles
- Cómo configurar la cadena de respuesta JSON formateada en un TextView?