无法从内部目录读取 apk 文件

Unable to read an apk file from an internal directory

我正在从 s3 下载 apk 并将其存储在名为 SAMPLE_APK 的目录中。当我尝试执行目录中的 apk 时,出现错误。

2022-03-01 15:44:20.773 21867-21867/com.test.digitaloceanspaces D/Main Activity -: File 
path  - /data/user/0/com.test.digitaloceanspaces/app_SAMPLE_APK/debug.apk
2022-03-01 15:44:20.774 21867-21867/com.test.digitaloceanspaces D/AndroidRuntime: 
Shutting down VM  

--------- beginning of crash
2022-03-01 15:44:20.779 21867-21867/com.test.digitaloceanspaces E/AndroidRuntime: FATAL 
EXCEPTION: main
    Process: com.test.digitaloceanspaces, PID: 21867
    java.lang.IllegalArgumentException: Failed to find configured root that contains 
/data/data/com.test.digitaloceanspaces/app_SAMPLE_APK/debug.apk
    at  
androidx.core.content.FileProvider$SimplePathStrategy
.getUriForFile(FileProvider.java:800)
    at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:442)

但是如果我从 filesDir 读取 apk,我就可以执行它。

下面两个不同的目录结构

无法读取回调方法的文件参数中存在的 apk。

fun downloadLatestApk(callback: (File?, Exception?) -> Unit) {

//using a custom directory named sample apk
 val directoryName = "SAMPLE_APK"

    val directory = if (appContext.getDir(directoryName, Context.MODE_PRIVATE).exists()) 
    {
        Log.d("Local directory", "APK directory Already exists")
        appContext.getDir(directoryName, Context.MODE_PRIVATE)
    } else {
        Log.d("Local directory", "New Directory")
        File(appContext.filesDir, directoryName).apply {
            this.mkdir()
        }
    }

    val file = File(**directory**, "debug.apk")
    val listener = transferUtility.download(spacename, "debug.apk", file)

    listener.setTransferListener(object : TransferListener {

        override fun onStateChanged(id: Int, state: TransferState?) {
            if (state == TransferState.COMPLETED) {
                callback(file, null)
            }
        }
 }

能够执行回调方法的文件参数中存在的apk。在这里,我正在读取 filesDir 中存在的 apk。

fun downloadLatestAPk(callback: (File?, Exception?) -> Unit) {
//using files dir
val file = File(**appContext.filesDir**, "debug.apk")
    val listener = transferUtility.download(spacename, "debug.apk", file)

    listener.setTransferListener(object : TransferListener {

        override fun onStateChanged(id: Int, state: TransferState?) {
            if (state == TransferState.COMPLETED) {
                callback(file, null)
            }
        }
}

这仅适用于 apk。我能够从任一目录读取图像文件。无法理解这种行为。

文件夹结构 - Folder Structure

文件提供者有以下路径。

<paths>
<external-path
    name="external"
    path="." />

<external-files-path
    name="external_files"
    path="." />

<cache-path
    name="cache"
    path="." />

<external-cache-path
    name="external_cache"
    path="." />

<files-path
    name="files"
    path="." />
</paths>

回调方法中的文件被发送到下面的方法执行。

private fun handleInstallation(file: File) {

    Log.d("Main Activity - ", "File path  - ${file.path}")

    val contentUri =
        FileProvider.getUriForFile(
            this,
            "com.test.digitaloceanspaces" + ".provider", file
        )

    val intent = Intent()
    intent.action = Intent.ACTION_VIEW
    intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true)
    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION
    intent.setDataAndType(contentUri, "application/vnd.android.package-archive")
    startActivity(intent)
}

应用程序在打印日志语句后崩溃。 非常感谢任何帮助。

path - /data/user/0/com.test.digitaloceanspaces/app_SAMPLE_APK/debug.apk

这是 FileProvider 未覆盖的路径。

来自 getFilesDir() 被条目 <files-path 覆盖。

你可以做到:

/data/user/0/com.test.digitaloceanspaces/files/app_SAMPLE_APK/debug.apk

FileProvider 未涵盖:java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.test.digitaloceanspaces/app_SAMPLE_APK/debug.apk

Unable to read an apk file from an internal directory

没有。无法为不允许的路径使用 FileProvider。