You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 11(API 30)下cordova邮件插件发送附件失效问题咨询

问题根因

Android 11(API 级别 30)引入了强制分区存储机制,禁止应用直接访问其他应用的私有目录、公共存储目录下的非媒体类文件,当前实现存在两个核心问题:

  • 日志存储在公共Download目录下,第三方邮件客户端没有权限读取该路径下非自身生成的非媒体文件
  • 附件Uri没有通过FileProvider封装,直接传递原始路径对应的Uri会触发系统权限拦截
解决方案

步骤1:修改日志存储路径为应用私有外部存储目录

不需要再使用公共Download目录,改用应用自身的外部私有目录,该目录不需要申请任何存储权限即可读写,且可以通过FileProvider给其他应用开放临时访问权限:
修改createLogs方法中的路径生成逻辑:

// 替换原有的公共路径代码
// File appDirectory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/c4cex");
File appDirectory = new File(ctx.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "/c4cex");

getExternalFilesDir返回的是/sdcard/Android/data/[你的应用包名]/files/Download路径,全Android版本都不需要申请存储权限即可正常读写。

步骤2:配置FileProvider

首先在项目AndroidManifest.xml的<application>标签内添加Provider配置:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="com.sap.cloud4custex.emailcomposer.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

然后在res/xml目录下新建file_paths.xml文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path
        name="app_download_logs"
        path="Download/c4cex" />
</paths>

步骤3:修改附件Uri生成逻辑

替换setAttachments方法中Uri解析逻辑,使用FileProvider生成带授权的Uri:

for (int i = 0; i < attachments.length(); i++) {
    String filePath = attachments.optString(i);
    File logFile = new File(filePath);
    if (logFile.exists()) {
        Uri uri = FileProvider.getUriForFile(ctx, "com.sap.cloud4custex.emailcomposer.provider", logFile);
        uris.add(uri);
    }
}

注意:此处的authorities参数必须和Manifest中配置的完全一致

步骤4:保留现有Intent授权逻辑

原有代码中添加的FLAG_GRANT_READ_URI_PERMISSION可以保留,不需要额外添加FLAG_GRANT_WRITE_URI_PERMISSION,邮件客户端仅需要读权限即可读取附件内容。

补充说明

该方案同时兼容Android 10及更低版本,不需要做版本分支判断,也不需要申请MANAGE_EXTERNAL_STORAGE敏感权限,完全符合Google Play的权限审核要求。

内容的提问来源于stack exchange,提问作者Bubbly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:24:03