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:

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.

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.

  • Buscando en YouTube HTML5 video sobre Android WebView
  • Reproduce dos videos en un VideoView al mismo tiempo
  • ¿Cómo podemos agregar la imagen animada / simple como una capa superior al video y exportarla como un solo video en Android?
  • Transferir flujo de video en tiempo real al servidor mediante Android
  • Peer-to-Peer de vídeo de iOS a Android?
  • ¿Cómo mux archivo de audio y archivo de vídeo?
  • Reproducir audio de un video musical usando la API de Youtube en android, cuando mi aplicación está minimizada
  • Reproducir vídeo en pantalla completa en Android con reproductor de vídeo nativo
  • Android MediaPlayer seekTo no funciona
  • ¿Cómo puedo capturar una grabación de vídeo en Android?
  • Reproducción de vídeo de Android Things en Raspberry Pi
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.