不打开活动即可提示默认活动?

4

我需要设置特定mime类型的默认应用程序。我知道如何清除默认值,但我需要在不实际打开应用程序的情况下提示用户。

PackageManager p = mContext.getPackageManager();
ComponentName cN = new ComponentName(mContext, FakeDownloadActivity.class);
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

Intent selector = new Intent(Intent.ACTION_DEFAULT);
selector.addCategory(Intent.CATEGORY_DEFAULT);
selector.setType(mimeType);
mContext.startActivity(selector);

p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

上面的代码启动了活动,而不仅仅是选择默认活动。它通过启用一个假活动,然后禁用它来实现。这会导致下一次调用时显示“选择默认应用程序”对话框。我只想选择默认活动。

1个回答

6
你需要的是一个 ACTION_PICK_ACTIVITY 意图。首先,你需要创建一个意图,定义那些应用程序可以被选择,例如:
Intent mainIntent = new Intent(Intent.ACTION_DEFAULT, null);
mainIntent.addCategory(Intent.CATEGORY_DEFAULT);

然后,你创建 ACTION_PICK_ACTIVITY 意图,并将之前创建的主要意图作为附加项传递。

Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);
pickIntent.putExtra(Intent.EXTRA_INTENT, mainIntent);

现在,您只需使用此意图启动一个带有结果的活动:
startActivityForResult(pickIntent, 0);

一个对话框将被创建,用户可以在其中选择一个应用程序,但是当被点击时,该活动不会被启动,而是留在您的活动中,函数onActivityResult将被调用并返回结果。因此,您需要创建这个函数:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

               //In data, you have all the information about the selected application
       if (data != null) {
                 //You can launch the application that we just picked with startActivity(data);
                 //or explore the variable to get all the information than you want
       }
    }

看一下 Intent 类,其中有关于包名和需要启动的类的信息。
从现在开始,你需要将该包名和类设置为 intent 的默认值或者其他你需要设置的内容。不好的一面是,你只能将这些信息保存在你自己的内部目的中,例如决定下一次用户执行某些操作时要启动哪个应用程序。你无法修改系统设置来为给定的 intent 设置默认活动。实际上,包管理器有 addPreferredActivity 方法,可以完成这个任务,但自 API 级别 8 开始就已弃用,原因如下:

这是受保护的 API,不应该提供给第三方应用程序。将优先活动分配给平台是平台的责任,这不能直接修改。向系统添加一个新的优先活动映射。当 Context.startActivity() 找到多个匹配的活动并且还匹配给定的过滤器时,这将用于自动选择给定的活动组件。


“坏处是,你只能将这些信息保存在自己的内部目的中,例如决定下次用户执行某些操作时启动哪个应用程序。” - 这正是我想要避免的。解决方案需要为给定的Intent设置Android系统设置。 - Randy
1
我猜你不可能在不打开应用的情况下完成这个操作,因为正如我所说,在Froyo中执行此操作的函数已被弃用,因为Android团队决定一个应用程序不应该更改它,而必须通过系统默认选择器创建和启动器来完成。至少,使用这种方法,你可以获得用户选择应用程序的对话框,并且你可以知道选中了哪一个。这是我能想到的最好的方法。恐怕我不能再做什么了。 - Carlos Robles
这正是我所怀疑的,但我很感激你的努力。 - Randy

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