无法从内部目录读取 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。
我正在从 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。