8

Tôi đang cố gắng để ứng dụng của mình tự động cài đặt gói ứng dụng. Điều này làm việc tốt cho api < 24. Nhưng đối với 24, nó là không. Android đã triển khai bảo mật bổ sung:Lập trình cài đặt một gói ứng dụng trong Android 7/api24

Đối với ứng dụng nhắm mục tiêu Android 7.0, khung công tác Android thực thi chính sách API StrictMode cấm hiển thị tệp: // URI bên ngoài ứng dụng của bạn. Nếu mục đích chứa URI tệp rời khỏi ứng dụng của bạn, ứng dụng sẽ không thành công với ngoại lệ FileUriExposedException.

Vì vậy, tôi cố gắng này:

Uri myuri; 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N){ 
     myuri = Uri.parse("file://"+outapk); 
    } else { 
     File o = new File(outapk); 
     myuri = FileProvider.getUriForFile(con, con.getApplicationContext().getPackageName() + ".provider", o); 
    } 
    Intent promptInstall = new Intent(Intent.ACTION_VIEW).setDataAndType(myuri,"application/vnd.android.package-archive"); 
    con.startActivity(promptInstall); 

nhưng có được một ngoại lệ gây tử vong:

com.android.packageinstaller "Caused by: java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{b42ee8a 6826:com.android.packageinstaller/u0a15} (pid=6826, uid=10015) that is not exported from uid 10066". 

tôi có xuất khẩu = true trong manifest của tôi.

Sự cố có vẻ là trình cài đặt gói không thể sử dụng nội dung: // uri.

Có cách nào để cho phép ứng dụng cài đặt một gói ứng dụng apk api24 một cách progammatic?

Trả lời

6

Có cách nào để cho phép ứng dụng cài đặt gói ứng dụng bằng api24 một cách progammatic?

Thêm addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) vào thiết lập promptInstall để cấp quyền truy cập đọc nội dung.

Tôi đã xuất = true trong tệp kê khai của mình.

Không có trên FileProvider, vì điều đó sẽ khiến ứng dụng của bạn gặp sự cố.

Sự cố có vẻ là trình cài đặt gói không thể sử dụng nội dung: // uri.

Không, vấn đề là bạn không cấp quyền cho trình cài đặt gói để đọc từ đó Uri. Nếu trình cài đặt gói không thể sử dụng sơ đồ content, bạn sẽ nhận được ActivityNotFoundException.

Lưu ý rằng mặc dù, chỉ với Android 7.0 trình cài đặt gói bắt đầu hỗ trợ content. Các phiên bản trước của Android phải sử dụng file.

+0

Tuyệt vời. Điều đó đã làm điều đó. Cảm ơn! – elsie

+0

addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION) cũng làm việc cho tôi. –

+0

Hey CommonsWare. chúng ta phải sử dụng nếu ... khác cho N và thấp hơn apis? không có cách nào khác để làm điều đó? – David

Các vấn đề liên quan