1

我正在开发一个使用自定义文件类型的应用程序,我已经弄清楚如何将我的应用程序注册到系统,以便能够使用意图过滤器打开这种类型的文件,并且我的应用程序也将显示在应用程序列表中可用于在尝试打开此类附件时从内置电子邮件客户端打开此文件。问题是从文件浏览器传入时处理打开文件的代码在从电子邮件客户端传入时不起作用。在选择正确类型的文件后,从文件浏览器调用 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.fiberdroid.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”是什么样的路径,为什么我不能打开它?

谢谢你。

4

2 回答 2

7

那是一个内容 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
}
于 2012-06-21T21:29:20.670 回答
7

对于任何可能偶然发现这个问题的人,以下是我从内容 URI 或以第三方应用程序的意图传入的文件 URI 读取文件数据的操作:

首先,将这些意图过滤器放入清单中,将“.trc”替换为您希望应用打开的类型的文件扩展名:

             <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="*/*" />
                <data android:scheme="file" />
                <data android:host="*" />
                <data android:port="*" />
                <data android:pathPattern=".*..*..*..*..*..*.trc" />
                <data android:pathPattern=".*..*..*..*..*.trc" />
                <data android:pathPattern=".*..*..*..*.trc" />
                <data android:pathPattern=".*..*..*.trc" />
                <data android:pathPattern=".*..*.trc" />
                <data android:pathPattern=".*.trc" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="content" />
                <data android:mimeType="text/plain" />
            </intent-filter>

不要问我那些路径模式,在偶然发现这个网站上的那个解决方案之前,我尝试了很多不起作用的东西,它是第一个有效的,所以我保留了它。

然后,将与此类似的代码添加到将接收文件的活动的 onCreate() 方法(util.loadOTDRFile 函数特定于我的应用程序,您必须自己制作才能加载文件):

        Intent i = getIntent();
        if(i == null) return;
        Uri u = i.getData();
        if(u == null) return;
        String scheme = u.getScheme();

        if(ContentResolver.SCHEME_CONTENT.equals(scheme))
        {
            try
            {
                ContentResolver cr = getContentResolver();
                AssetFileDescriptor afd = cr.openAssetFileDescriptor(u, "r");
                long length = afd.getLength();
                byte[] filedata = new byte[(int) length];
                InputStream is = cr.openInputStream(u);
                if(is == null) return;
                try
                {
                    is.read(filedata, 0, (int) length);
                    Util.loadOTDRFileFromByteArray(filedata);
                }
                catch(IOException e)
                {
                    return;
                }   
            }
            catch(FileNotFoundException e)
            {
                return;
            }
        } 
        else
        {
            String filePath = u.getEncodedPath();
            if(filePath == null) return;
            Util.loadOTDRFileFromPath(filePath);
        }
于 2012-06-22T13:15:01.413 回答