Android:打开从电子邮件客户端附件传递到 Activity 的文件查看 Intent

标签 android android-intent

我正在开发一个使用自定义文件类型的应用程序,我已经想出了如何在系统中注册我的应用程序,以便能够使用 Intent 过滤器打开这种类型的文件,我的应用程序也会显示在尝试打开此类附件时,可用于从内置电子邮件客户端打开此文件的应用程序列表。问题是从文件浏览器传入时处理打开文件的代码在从电子邮件客户端传入时不起作用。这是我在选择正确类型的文件后从文件浏览器调用 Activity 时使用的代码,它可以正常工作:

Intent i = getIntent();
if(i == null) return;
Uri u = i.getData();
if(u == null) return;
String filePath = u.getEncodedPath();
if(filePath == null) return;
Util.loadOTDRFile(filePath);

从文件浏览器加载时,我在“filePath”字符串中得到的内容类似于“mnt/storage/Android/data/com.firdroid.001/downloads/filename.trc...,我的应用程序运行良好成功将其加载到 loadOTDRFile() 函数中。

但是,当我从电子邮件客户端打开相同类型的文件时,该代码中的 filePath 变量最终变成如下所示:“//mail/parts/4217”未加载,我的加载函数返回一个找不到文件错误。

这是来自 loadOTDRFile() 函数的相关代码:

File file = new File(filePath);
InputStream is;
try
{
    is = new FileInputStream(filePath);
}
catch(FileNotFoundException e)
{
    return D.ERROR_FILENOTFOUND;
}

我想我的问题是“//mail/parts/4217”是什么路径,为什么打不开?

谢谢。

最佳答案

这是一个 Content URI...您需要使用 ContentResolver 打开来自邮件提供商的文件。

要做到这一点,你应该这样做:

getContentResolver().openInputStream(u); // Where 'u' is the uri you extract from the intent.

你可能希望把这样的东西:

Uri u = i.getData();
String scheme = u.getScheme();
if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
    // handle as content uri
} else {
    // handle as file uri
}

关于Android:打开从电子邮件客户端附件传递到 Activity 的文件查看 Intent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11146017/

相关文章:

android - 如何将 15Mb 文件从 Assets 文件夹复制到 SD 卡...?

android - 获取构建错误 : `duplicate entry: javax/annotation/CheckForNull.class`

java.lang.IllegalStateException : Fragment ProgressDialog{x) not associated with a fragment manager 错误

java - 如何防止 startCommand 在应用程序关闭时返回 null

android.content.ActivityNotFoundException : No Activity found to handle Intent splash screen

java - 在应用程序上使用 Intent 共享图像时出现错误共享失败

android - 在android终端中遇到一个bug

Android WebDav 库

android - Intent 过滤器 : intent. getData() 返回 null

android - 使用 Android 联系人应用程序编辑由自定义 ContentProvider 添加的原始联系人