Fileprovider 总是抛出 IAE

Fileprovider always throws IAE

我查看了 Whosebug 上的所有答案,但没有找到适合我的答案。

真实设备和模拟器出现同样的错误。

Fileprovider 总是抛出 IllegalArgumentException

有清单

<application
   ...

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

</application>

有filepath.xml

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

并且有代码总是抛出异常

        final Intent emailIntent = new Intent(Intent.ACTION_SEND);
        emailIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

        File file = new File(logger.getFileName());
        Uri uri = null;
        try {
            uri = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID, file);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }

logger.getFileName() - returns真实文件名例如:"logs_22032019.txt"

我已经尝试过的: 清单中的更改,例如: android:authorities="com.realname.of.package" filepath.xml

的变化
name="logs"

我注意到的 - 确实有文件路径:

/data/user/0/com.app.realname/files/log.txt

但是其中的 FileProvider 转到:

"log.txt" -> "/data/data/com.app.realname/files/log.txt"-->

注意:我只需要内部存储。

logger.getFileName() - returns real file name for example: "logs_22032019.txt"

这不是有效的文件系统路径。这是一个有效的文件名,但没有说明该文件在设备上的位置。

这是您的 FileProvider 配置:

<files-path
    name="logs"
    path="logs/" />

为此,可行的 File 是:

File file = new File(getFilesDir(), "logs/"+logger.getFileName());

there is really the path of files... But FileProvider in it goes to

对于主要设备用户,这些是相同的文件系统位置。