Quiero obtener los cuadros del video RTSP usando ffmpeg. Pero para Android 10 anterior recibo un error como el siguiente.
E/FFmpeg: Exception while trying to run: [Ljava.lang.String;@55e447f
java.io.IOException: Cannot run program "/data/user/0/com.example.downloadimagefromurl/files/ffmpeg": error=13, Permission denied
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1050)
at java.lang.Runtime.exec(Runtime.java:698)
at java.lang.Runtime.exec(Runtime.java:563)
at com.github.hiteshsondhi88.libffmpeg.ShellCommand.run(ShellCommand.java:10)
at com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground(FFmpegExecuteAsyncTask.java:38)
at com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground(FFmpegExecuteAsyncTask.java:10)
at android.os.AsyncTask$3.call(AsyncTask.java:378)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Caused by: java.io.IOException: error=13, Permission denied
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:133)
Como la respuesta proporcionada por @Saurabh Thorat, Google no permite que las aplicaciones ejecuten archivos binarios desde el directorio / data / user.
Una mala solución que conozco es cambiar compileSdkVersion y targetSdkVersion a 28 o menos y volver a lanzar mi aplicación, lo cual no es recomendable.
Por lo tanto, estoy buscando soluciones más viables para futuras versiones también.
Cualquier sugerencia, enlace o sugerencia sería muy apreciada. Gracias por adelantado.
android
ffmpeg
permissions
rtsp
android-10.0
gowthami
fuente
fuente
Respuestas:
Desde Android Q en adelante, no puede ejecutar archivos binarios en el directorio de datos privados de su aplicación.
Del rastreador de problemas: https://issuetracker.google.com/issues/128554619
fuente
Cambie solo en el archivo Build.gradle targetSdkVersion 29 a 28 y vuelva a instalar su aplicación en su dispositivo
fuente
La respuesta anterior explica correctamente el problema al que te estás enfrentando. Este es también un tema abierto planteado en septiembre pasado, discutido en el foro de la biblioteca que está utilizando (por lo que puedo ver en el seguimiento de la pila).
La solución para compilar para el SDK 29 sería dejar de colocar archivos binarios en el directorio / data / y asegurarse de que están en el directorio libs nativo. Eso no se puede lograr después de que el APK esté instalado y desempaquetado en dispositivos no rooteados, por lo que debe hacerse correctamente al preparar el proyecto de Android (por ejemplo, a través de la configuración de Gradle), y para asegurarse de que después de la instalación, el contenido se desempaquete correctamente:
android:extractNativeLibs=true
.En su caso, este código mueve los archivos binarios que se empaquetan como 'activos' en el directorio de datos de los usuarios:
https://github.com/WritingMinds/ffmpeg-android-java/blob/master/FFmpegAndroid/src/main/java/com/github/hiteshsondhi88/libffmpeg/FileUtils.java
Esa es una preocupación de seguridad que ejecuta cualquier ejecutable en una ubicación que sea de lectura / escritura. Ese código fuente al que me vinculé anteriormente debería eliminarse, en su lugar, los binarios nativos empaquetados en / libs. El cambio es más seguro ya que la ubicación / libs dentro del directorio de instalación de sus aplicaciones es ejecutable pero no se puede escribir.
En resumen, la biblioteca de terceros debe abordarlo, o puede hacerlo y contribuir con una solicitud de extracción. O bifurca el tuyo y recompílalo por ti mismo.
Todavía hay un problema, si su aplicación realmente descarga contenido después de que se instala, y espera ejecutar cualquier descarga. Eso es ahora imposible hasta donde puedo decir en Android 10.
La solución a prueba de futuro es dejar de usar binarios externos y compilar las dependencias como proyectos NDK. Necesitarán envoltorios jni alrededor del código nativo (un poco de trabajo). Hay un proyecto relacionado que sé que podrías investigar.
fuente