对于任何可能偶然发现这个问题的人,以下是我从内容 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);
}