基于 Android 文件启动一个活动(Activity)

5
我正在开发一款列出文件夹中文件的应用程序(在 ListView 中)。当用户点击其中一个项目时,如果它是一个文件,则我想要启动一个能够处理它的活动(如果有任何),否则显示某种错误消息。
我该怎么做呢?当然不是整个程序,但是我如何确定哪些应用程序可以处理文件(如果有)?

关于这个问题有许多类似的帖子,但没有一个是特别针对我的问题,并且也没有一个可以回答我的问题,因此在标记为重复之前,请仔细阅读其他帖子。 - Gallal
2个回答

7

首先,您需要确定文件的MIME类型。您可以使用MimeTypeMap来完成:

MimeTypeMap map = MimeTypeMap.getSingleton();
String extension = map.getFileExtensionFromUrl(url); // url is the url/location of your file
String type = map.getMimeTypeFromExtension(extension);

那么一旦您知道了MIME类型,就可以为该类型创建一个意图(intent):
Intent intent = new Intent();
intent.setType(type);

最后,您需要检查是否有任何活动可以使用该类型解析意图。这可以通过PackageManager完成:

PackageManager manager = getPackageManager(); // I'm assuming this is done from within an activity. This a Context method.
List<ResolveInfo> resolvers = manager.queryIntentActivities(intent, 0);
if (resolvers.isEmpty()) {
  // display error
} else {
  // launch the intent. You will also want to set the data based on the uri of your file
}

我尝试过这个,对于一些像'pdf'和'doc'这样的扩展名可以正常工作,但是当我使用'JPG'时它会给我返回一个长长的无意义的列表,显示像GPS这样的系统工具可以处理'JPG'。还有其他的建议吗? - Gallal
1
PackageManager 中还有一个 getPreferredActivities() 方法,您可以利用它来确定是否有首选应用程序来处理特定的 MIME 类型,但除此之外,这是预期的 Android 行为。 - Noel

0

基于...

如何确定哪个应用程序(如果有)可以处理文件?

我认为你需要使用PackageManager.queryIntentActivities,其中你可以根据目标文件创建一个意图,然后读取返回的列表。


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