разрешение отклонено с помощью Android Q ffmpeg ": ошибка = 13, разрешение отклонено - PullRequest
9 голосов
/ 24 февраля 2020

Я хочу получить кадры из видео RTSP с помощью ffmpeg. Но для android 10 и выше я получаю сообщение об ошибке, как показано ниже.

 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)

Как ответ @Saurabh Thorat, Google не позволяет приложениям запускать двоичные файлы из каталога / data / user.

Одно плохое решение, которое я знаю, это изменить compileSdkVersion и targetSdkVersion на 28 или ниже и повторно выпустить мое приложение, что не рекомендуется.

Следовательно, я ищу и более жизнеспособные решения для будущих выпусков.

Любая подсказка, ссылки или предложения будут высоко оценены. Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 25 марта 2020

Изменить только в файле Build.gradle targetSdkVersion 29 - 28 и переустановить приложение на своем устройстве

4 голосов
/ 24 февраля 2020

Начиная с Android Q, вы не можете выполнять двоичные файлы в каталоге личных данных вашего приложения.

Из эмитента: https://issuetracker.google.com/issues/128554619

изменить на exe c () в файлах данных приложения для targetAPI> = Q работает по назначению. Пожалуйста, смотрите https://android-review.googlesource.com/c/platform/system/sepolicy/+/804149 для справки об этом изменении. Вызов exe c () для записываемых файлов приложений является нарушением W ^ X (https://en.wikipedia.org/wiki/W%5EX) и представляет собой небезопасную практику приложений. Исполняемый код всегда должен загружаться из приложения APK.

Хотя exe c () больше не работает с файлами в домашнем каталоге приложения, он продолжает поддерживаться для файлов в режиме только для чтения / data / каталог приложений. В частности, должна быть возможность упаковать двоичные файлы в собственный каталог libs вашего приложения и включить android: extractNativeLibs = true, а затем вызвать exe c () для артефактов / data / app. Аналогичный подход осуществляется с функциональностью wrap. sh, задокументированной в https://developer.android.com/ndk/guides/wrap-script#packaging_wrapsh.

Кроме того, имейте в виду, что исполняемые файлы, выполняемые через exe c (), не управляются в соответствии с жизненным циклом Android процесса, и, вообще говоря, exe c () не рекомендуется из Android приложений , Хотя это не документация Android, Использование «exe c ()» с NDK описывает это в некоторых деталях. Полагаться на exe c () может быть проблематично c в будущих Android версиях.

2 голосов
/ 12 марта 2020

более ранний ответ правильно объясняет проблему, с которой вы столкнулись. Это также открытый выпуск , поднятый в сентябре прошлого года и обсуждавшийся на форуме используемой вами библиотеки (из того, что я вижу в трассировке стека).

Решение для компиляции для SDK 29 состояло бы в том, чтобы прекратить помещать двоичные файлы в каталог / data / и убедиться, что они находятся в собственном каталоге libs. Этого нельзя достичь после того, как APK установлен и распакован на нерутированных устройствах, и это должно быть сделано правильно при подготовке проекта Android (например, с помощью настроек gradle), а также чтобы убедиться, что после установки содержимое становится правильным без упаковки: android:extractNativeLibs=true.

В вашем случае этот код перемещает двоичные файлы, которые упакованы как «активы», в каталог данных пользователя:

https://github.com/WritingMinds/ffmpeg-android-java/blob/master/FFmpegAndroid/src/main/java/com/github/hiteshsondhi88/libffmpeg/FileUtils.java

Это из соображений безопасности запуск любых исполняемых файлов в месте, доступном для чтения / записи. Этот исходный код, на который я ссылался выше, нужно будет удалить, вместо этого нативные двоичные файлы, упакованные в / libs. Изменение является более безопасным, поскольку расположение / libs в каталоге установки вашего приложения является исполняемым, но недоступным для записи.

Таким образом, сторонняя библиотека должна решить эту проблему, или вы можете сделать это и отправить запрос на удаление. Или раскройте свой собственный и перекомпилируйте его для себя.

По-прежнему существует проблема, если ваше приложение действительно загружает контент после его установки и ожидает выполнения каких-либо загрузок. Сейчас это невозможно, насколько я могу судить по Android 10.

. Перспективное решение - прекратить использование внешних двоичных файлов и скомпилировать зависимости как проекты NDK. Им понадобятся jni-оболочки вокруг нативного кода (немного работы). Есть связанный проект Я знаю, что вы можете посмотреть.

...