如何通过意图在另一个应用程序中打开本地应用程序文件?

3

作为我的问题前置条件,需要注意一些事情。在这种情况下,我不想将文件存储在sd卡上。该文件也不能直接存储在应用程序的本地文件目录中。它需要位于子目录中,因此无法使用openFileOutput()和MODE_WORLD_READABLE来写入文件。

该应用程序可以下载诸如pdf之类的小文件并将其存储在子目录中。如果用户有可以打开这些文件的应用程序,我希望能够让用户打开这些文件。

例如,以下是用于发送pdf的意图:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(path), "application/pdf");
startActivity(intent);

路径类似于:/data/data/packagename/files/subdir/example.pdf

该意图将打开一个PDF浏览器,但是该浏览器无法打开该文件。我认为这是权限问题。我尝试了Mark Murphy在此处的建议:http://groups.google.com/group/android-developers/browse_thread/thread/4e55d869213483a9/b7270078ac1a2744?lnk=raot使用Runtime.getRuntime().exec("chmod 755 " + fileName);,但没有任何区别。他还建议使用内容提供程序,但如果可能的话,我想避免使用它,因为看起来只是为了将这个文件传递给另一个应用程序而需要很多步骤。

如果内容提供程序是唯一的选择,我是否必须将文件保存到内容提供程序中,或者仅在需要时将其作为内容提供程序通过以获取到另一个应用程序?

谢谢,如果我表达不清楚,请告诉我。


其他活动无法访问您的文件。如果需要访问,您必须将它们保存到SD卡或使用内容提供程序。 - Falmarri
2个回答

0

我也尝试了你提到的所有选项(以及更多),内容提供者是唯一有效的方法。我不太确定你所说的“将文件保存到内容提供者”是什么意思,但实际上你并不需要在数据库中存储任何东西,内容提供者就可以向其他应用程序提供文件。


0

您可能想看一下android:sharedUserId清单属性:

这个属性是用来指定一个Linux用户ID,将会与其他应用程序共享。默认情况下,Android为每个应用程序分配其自己唯一的用户ID。但是,如果将该属性设置为两个或更多应用程序的相同值,则它们将共享相同的ID——前提是它们还由相同的证书签名。相同用户ID的应用程序可以访问彼此的数据,并且如果需要,可以在同一进程中运行。

请注意,您的应用程序已经有一个不能确定的默认ID(据我所知)。最好为两个应用程序定义相同的sharedUserId,然后将它们安装到新的模拟器上。

第二个问题是,您确定能够查看PDF文件吗?我认为在Android中还没有对其进行支持。


我会看一下,但我不确定是否想要将整个应用程序开放给另一个应用程序。有些应用程序会打开PDF并检查是否存在PDF文件,然后再尝试打开。 - cottonBallPaws

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接