quyền bị từ chối khi sử dụng Android Q ffmpeg ": error = 13, Quyền bị từ chối


9

Tôi muốn lấy các khung từ video RTSP bằng ffmpeg. Nhưng đối với android 10 ở trên thì tôi gặp lỗi như bên dưới.

 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)

Như câu trả lời được cung cấp bởi @Saurabh Thorat, Google không cho phép các ứng dụng chạy các tệp nhị phân từ thư mục / data / user.

Một giải pháp tồi mà tôi biết là thay đổi compileSdkVersion và targetSdkVersion thành 28 hoặc thấp hơn và phát hành lại ứng dụng của tôi không được khuyến nghị.

Do đó, tôi đang tìm kiếm các giải pháp khả thi hơn cho các bản phát hành trong tương lai.

Bất kỳ gợi ý, liên kết hoặc đề nghị sẽ được đánh giá cao. Cảm ơn trước.


có thể liên quan đến stackoverflow.com/questions/8854359/
Priyankagb

Không có @Priyankagb tôi đã cấp quyền lưu trữ ngoài cho ứng dụng của mình
gowthami

sử dụng thư viện này tôi đã thực hiện github.com/PratikVekariya4445/FFmpegAndroid , cùng một vấn đề tôi gặp phải với một vấn đề nữa về hỗ trợ 64 bit, sau một số nghiên cứu tôi không tìm thấy giải pháp nào và tôi đã tạo ra thư viện riêng và các vấn đề cố định. Hãy cho tôi biết nếu bạn có bất kỳ nghi ngờ hoặc bất kỳ vấn đề nào
pratik vekariya

đối với mẫu của bạn, tôi cũng gặp lỗi tương tự 2020-02-24 12: 38: 16.934 2817-3054 / com.techdorid.ffmpegandroid.demo W / System.err: java.io.IOException: Không thể chạy chương trình "/ data / user /0/com.techdorid.ffmpegandroid.demo/files/ffmpeg ": error = 13, Quyền bị từ chối
gowthami

trong dòng này tôi đang gặp lỗi (FFmpegExecuteAsyncTask.java:44)
gowthami

Câu trả lời:


4

Từ Android Q trở đi, bạn không thể thực thi nhị phân trong thư mục dữ liệu riêng tư của ứng dụng.

Từ nhà phát hành: https://issuetracker.google.com/issues/128554619

Thay đổi để chặn exec () trên các tệp dữ liệu ứng dụng cho targetAPI> = Q là hoạt động như dự định. Vui lòng xem https://android-review.googlesource.com/c/pl platform / system / sicicy / + / 804149 để biết thông tin cơ bản về thay đổi này. Gọi exec () trên các tệp ứng dụng có thể ghi là vi phạm W ^ X ( https://en.wikipedia.org/wiki/W%5EX ) và thể hiện một thực tiễn ứng dụng không an toàn. Mã thực thi phải luôn được tải từ APK của ứng dụng.

Mặc dù exec () không còn hoạt động trên các tệp trong thư mục gốc của ứng dụng, nó vẫn tiếp tục được hỗ trợ cho các tệp trong thư mục chỉ đọc / dữ liệu / ứng dụng. Cụ thể, có thể đóng gói các nhị phân vào thư mục libs gốc của ứng dụng của bạn và kích hoạt android: extractNativeLibs = true, sau đó gọi exec () trên các tạo phẩm / data / app. Một cách tiếp cận tương tự được thực hiện với chức năng quấn.sh, được ghi lại tại https://developer.android.com/ndk/guides/wrap-script#packaging_wrapsh .

Ngoài ra, xin lưu ý rằng các tệp thực thi được thực thi thông qua exec () không được quản lý theo vòng đời của quy trình Android và nói chung, exec () không được khuyến khích từ các ứng dụng Android. Mặc dù không phải là tài liệu Android, nhưng việc sử dụng "exec ()" với NDK sẽ đề cập chi tiết này. Dựa vào exec () có thể có vấn đề trong các phiên bản Android trong tương lai.


bạn có thể vui lòng cho tôi biết những gì tôi phải thêm. Để làm việc mã id android 10
gowthami

@gowthami bạn đã giải quyết điều này?
Chitrang

@Chitrang không tôi không nhận được câu trả lời. Nếu bạn có bất cứ điều gì. Hãy chia sẻ với tôi
gowthami

Đó là lý do tại sao tôi bắt đầu tiền thưởng này, hãy hy vọng điều tốt nhất.
Chitrang

Luôn luôn giống nhau và chính xác là điều tương tự xảy ra với tôi với bravobit ffmpeg ... Bất cứ khi nào Google phát hành phiên bản Android mới, bạn phải bắt chéo tay để ứng dụng của bạn sẽ không ngừng hoạt động theo bất kỳ cách nào: ((
Diego Perez

4

Chỉ thay đổi trên tệp Build.gradle targetSdkVersion 29 đến 28 và Cài đặt lại ứng dụng của bạn trên thiết bị của bạn


2
Cảm ơn bạn. đây thực sự là một cách giải quyết tuyệt vời không chắc chắn tại sao bạn bị hạ cấp.
đau

Cách giải quyết tuyệt vời, cảm ơn!.
dgcipp

2

Các câu trả lời trước đó giải thích một cách chính xác vấn đề bạn đang đánh. Đây cũng là một vấn đề mở được đưa ra vào tháng 9 năm ngoái, được thảo luận trên diễn đàn của thư viện bạn đang sử dụng (từ những gì tôi có thể thấy trong theo dõi ngăn xếp).

Giải pháp để biên dịch cho SDK 29 sẽ là dừng đặt nhị phân vào thư mục / data / và đảm bảo chúng nằm trong thư mục libs gốc. Điều đó không thể đạt được sau khi APK được cài đặt và giải nén trên các thiết bị chưa root, và do đó, nên được thực hiện chính xác khi chuẩn bị dự án Android (ví dụ: thông qua cài đặt lớp) và để đảm bảo rằng khi cài đặt, nội dung sẽ được giải nén đúng cách: android:extractNativeLibs=true.

Trong trường hợp của bạn, mã này di chuyển các tệp nhị phân được đóng gói dưới dạng 'tài sản' vào thư mục dữ liệu người dùng:

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

Đó là mối quan tâm bảo mật khi chạy bất kỳ tệp thực thi nào ở vị trí có thể đọc / ghi được. Mã nguồn mà tôi đã liên kết ở trên sẽ cần phải được xóa, thay vào đó, các tệp nhị phân riêng được đóng gói trong / libs. Thay đổi này an toàn hơn vì vị trí / libs trong thư mục cài đặt ứng dụng của bạn có thể thực thi được nhưng không thể ghi được.

Tóm lại, lib của bên thứ 3 cần giải quyết nó, hoặc bạn có thể làm điều đó và đóng góp một yêu cầu kéo. Hoặc ngã ba của riêng bạn và biên dịch lại nó cho chính mình.

Vẫn còn một vấn đề, nếu ứng dụng của bạn thực sự tải xuống nội dung sau khi được cài đặt và dự kiến ​​sẽ thực hiện bất kỳ tải xuống nào. Điều đó bây giờ là không thể như tôi có thể nói trong Android 10.

Giải pháp chứng minh trong tương lai là ngừng sử dụng các nhị phân bên ngoài và biên dịch các phụ thuộc như các dự án NDK. Họ sẽ cần các hàm bao jni xung quanh mã gốc (một chút công việc). Có một dự án liên quan mà tôi biết bạn có thể xem xét.


1
Nó liên quan đến một chút công việc, tôi vẫn đang vật lộn với thư viện mà bạn đề cập.
Rohan Bojja
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.