带有 Intent 和 FileProvider 的 Android 打开资产图像文件显示大小 0

发布于 2025-01-10 16:15:41 字数 1330 浏览 2 评论 0原文

我将所有文件放在 assets 文件夹中,并使用以下功能打开它们:

fun Fragment.openAssetsFile(fileName: String) {
    val file = getAssetsFile(fileName)
    val fileUri = FileProvider.getUriForFile(requireContext(), "${requireContext().packageName}.provider", file)

    val intent = Intent(Intent.ACTION_VIEW).apply {
        type = "application/${file.extension}"        //<- doesn't work for image (jpg, png)
        data = fileUri

        addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
    }

    startActivity(intent)
}

fun Fragment.getAssetsFile(fileName: String): File {
    val file = File(requireContext().filesDir, fileName)

    if (!file.exists()) {
        file.outputStream().use { outputStream ->
            requireContext().assets.open(fileName).use { inputStream ->
                inputStream.copyTo(outputStream)
            }
        }
    }

    return file
}

Word、Excel、PPT、PDF、Mp4、Mp3 完美配合,但对于 >JPG、PNG 它显示 0 大小,如下所示:

(已尝试设置 mime 类型 image/* 但没有帮助。)

在此处输入图像描述


更新:在三星 Tab S5e 平板电脑、三星 S22 Ultra、华为 P50 Pro 和三星 Note 9 上测试,仅 Note 9 存在问题。

I place all the files in assets folder and use following functions to open them:

fun Fragment.openAssetsFile(fileName: String) {
    val file = getAssetsFile(fileName)
    val fileUri = FileProvider.getUriForFile(requireContext(), "${requireContext().packageName}.provider", file)

    val intent = Intent(Intent.ACTION_VIEW).apply {
        type = "application/${file.extension}"        //<- doesn't work for image (jpg, png)
        data = fileUri

        addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
    }

    startActivity(intent)
}

fun Fragment.getAssetsFile(fileName: String): File {
    val file = File(requireContext().filesDir, fileName)

    if (!file.exists()) {
        file.outputStream().use { outputStream ->
            requireContext().assets.open(fileName).use { inputStream ->
                inputStream.copyTo(outputStream)
            }
        }
    }

    return file
}

Working perfectly fine with Word, Excel, PPT, PDF, Mp4, Mp3, but for JPG, PNG it shows 0 size like this:

(Had tried setting the mime type image/* but no help.)

enter image description here


Update: Tested on Samsung Tab S5e tablet, Samsung S22 Ultra, Huawei P50 Pro and Samsung Note 9, only the Note 9 has the issue.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

花期渐远 2025-01-17 16:15:41

我尝试将 .png.jpeg 复制到资产文件夹中,我可以使用上述功能访问和查看这两个文件。

我刚刚传递了我的文件名以及扩展名,如下所示:

openAssetsFile("fileName.png")

或者

openAssetsFile("fileName.jpeg")

确保您已在 Android Manifest 文件中添加文件提供程序:

<provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>

res/xml 下添加此 provider_paths.xml目录

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path
        name="files"
        path="." />
    <external-cache-path
        name="external_files"
        path="." />
    <external-path
        name="external_files"
        path="." />
</paths>

然后它应该可以工作。

`

I tried by copying a .png and .jpeg into the assets folder and I can able to access and view both files using the above functions.

I just passed my file name along with extensions like below:

openAssetsFile("fileName.png")

OR

openAssetsFile("fileName.jpeg")

Make sure you have added the file provider in the Android Manifest file:

<provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>

add this provider_paths.xml under res/xml directory

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path
        name="files"
        path="." />
    <external-cache-path
        name="external_files"
        path="." />
    <external-path
        name="external_files"
        path="." />
</paths>

Then it should work.

`

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文