permission is denied using Android Q ffmpeg": error=13, Permission denied-ThrowExceptions

Exception or error:

Hi I want to get the frames from the rtsp video using ffmpeg. In android 10 it is working fine. I am getting the frames. In android 10 I am getting error like this.

 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)

Please anyone help to resolve the issue in android 10. thanks in advance.

How to solve:

From Android Q onwards, you cannot execute binaries in your app’s private data directory.

From the issuetracker: https://issuetracker.google.com/issues/128554619

The change to block exec() on application data files for targetAPI >=
Q is working-as-intended. Please see
https://android-review.googlesource.com/c/platform/system/sepolicy/+/804149
for background on this change. Calling exec() on writable application
files is a W^X (https://en.wikipedia.org/wiki/W%5EX) violation and
represents an unsafe application practice. Executable code should
always be loaded from the application APK.

While exec() no longer works on files within the application home
directory, it continues to be supported for files within the read-only
/data/app directory. In particular, it should be possible to package
the binaries into your application’s native libs directory and enable
android:extractNativeLibs=true, and then call exec() on the /data/app
artifacts. A similar approach is done with the wrap.sh functionality,
documented at
https://developer.android.com/ndk/guides/wrap-script#packaging_wrapsh
.

Additionally, please be aware that executables executed via exec() are
not managed according to the Android process lifecycle, and generally
speaking, exec() is discouraged from Android applications. While not
Android documentation,
Using "exec()" with NDK
covers this in some detail. Relying on exec() may be problematic in
future Android versions.

Leave a Reply

Your email address will not be published. Required fields are marked *