Android Q ffmpegを使用して権限が拒否されました ":エラー= 13、権限が拒否されました


9

ffmpegを使用してRTSPビデオからフレームを取得したい。しかし、上記の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ディレクトリからバイナリファイルを実行することを許可していません。

私が知っている悪い解決策の1つは、compileSdkVersionとtargetSdkVersionを28以下に変更し、推奨されないアプリケーションを再リリースすることです。

したがって、将来のリリースでもより実行可能なソリューションを探しています。

ヒント、リンク、提案は高く評価されます。前もって感謝します。



いいえ、@ Priyankagbはすでにアプリに外部ストレージのアクセス許可を与えています
gowthami

このライブラリを使用してgithub.com/PratikVekariya4445/FFmpegAndroidを作成しました。同じ問題が64ビットサポートのもう1つの問題に直面しました。調査の結果、解決策が見つからず、独自のライブラリを作成して問題を修正しました。疑問や問題がある場合は
お知らせください

サンプルでも同じエラー2020-02-24 12:38:16.934 2817-3054 / com.techdorid.ffmpegandroid.demo W / System.err:java.io.IOException:Ca n't run program "/ data / user /0/com.techdorid.ffmpegandroid.demo/files/ffmpeg ":エラー= 13、権限が拒否されました
gowthami

この行では、私はエラー(FFmpegExecuteAsyncTask.java:44)取得しています
gowthami

回答:


4

Android Q以降、アプリのプライベートデータディレクトリでバイナリを実行することはできません。

issuetrackerから:https ://issuetracker.google.com/issues/128554619

targetAPI> = Qのアプリケーションデータファイルでexec()をブロックする変更は、意図したとおりに機能しています。 この変更の背景については、https://android-review.googlesource.com/c/platform/system/sepolicy/+/804149を参照して ください。書き込み可能なアプリケーションファイルでexec()を呼び出すことはW ^ X(https://en.wikipedia.org/wiki/W%5EX)違反であり、安全でないアプリケーションプラクティスを表しています。実行可能コードは、常にアプリケーションAPKからロードする必要があります。

exec()は、アプリケーションのホームディレクトリ内のファイルに対しては機能しなくなりましたが、読み取り専用の/ data / appディレクトリ内のファイルに対しては引き続きサポートされます。特に、バイナリをアプリケーションのネイティブlibsディレクトリにパッケージ化し、android:extractNativeLibs = trueを有効にしてから、/ data / appアーティファクトでexec()を呼び出すことができるはずです。同様のアプローチは、https: //developer.android.com/ndk/guides/wrap-script#packaging_wrapshに記載されているwrap.sh機能を使用して行われ ます

また、exec()を介して実行される実行可能ファイルは、Androidプロセスのライフサイクルに従って管理されないことに注意してください。一般的に、exec()はAndroidアプリケーションでは推奨されません。Androidのドキュメントではありませんが、NDKで「exec()」を使用すると、 これについてある程度詳しく説明します。exec()に依存することは、将来のAndroidバージョンでは問題になる可能性があります。


追加する必要があるものを教えてください。このコードID android 10を使用するには
gowthami

@gowthami解決しましたか?
Chitrang

@Chitrangいいえ、答えはありませんでした。何かあれば。私と共有してください
gowthami

それが私がこの賞金を始めた理由です、最高のものを期待しましょう。
Chitrang

bravobit ffmpegを使用すると、常に同じ、まったく同じことが発生します... Googleが新しいAndroidバージョンをリリースするときはいつでも、アプリが動作を停止しないように、指をクロスする必要があります:((
Diego Perez

4

Build.gradleファイルの targetSdkVersion 29から28のみ変更 し、デバイスにアプリを再インストールします


2
ありがとうございました。これは実際には素晴らしい回避策でした。なぜ反対票が投じられたのかわかりません。
痛みを伴う

素晴らしい回避策、ありがとう!。
dgcipp

2

以前の回答正しく、あなたがヒットしている問題について説明します。これは、昨年9月に発生した未解決の問題でもあり、使用しているライブラリのフォーラムで議論されています(スタックトレースで確認できます)。

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の場所は実行可能ですが、書き込みはできないため、変更はより安全です。

要約すると、サードパーティのlibはそれに対処する必要があります。そうしないと、それを実行してプルリクエストを提供できます。または、自分でフォークして自分用に再コンパイルします。

アプリがインストール後に実際にコンテンツをダウンロードし、ダウンロードを実行することを期待している場合でも、まだ問題があります。これは、Android 10で確認できる限り不可能です。

将来性のあるソリューションは、外部バイナリの使用を停止し、依存関係をNDKプロジェクトとしてコンパイルすることです。彼らはネイティブコードの周りのjniラッパーを必要とします(少しの作業)。あり、関連プロジェクトに見ることができる私はあなたのことを知っているが。


1
それは少しの作業を伴いますが、私はまだあなたが言及したライブラリと苦労しています。
Rohan Bojja
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.