【问题标题】:How do I get the Default app chooser dialog to appear even if the default app is already chosen already?即使已经选择了默认应用程序,如何才能显示默认应用程序选择器对话框?
【发布时间】:2014-06-12 21:00:12
【问题描述】:

假设我有一个浏览器应用,

我想要一个名为“设为默认浏览器”的设置来显示对话框选择器,即使当前的默认浏览器不是我的应用。

如何让我以编程方式显示应用选择器对话框?

谢谢。

更新根据 Michal 的回答,我写了这个:

String url = FinalVariables.JAVELIN_URL;
Intent i = new Intent(Intent.ACTION_VIEW);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setData(Uri.parse(url));
startActivity(Intent.createChooser(i, getString(R.string.choose_javelin)));

虽然它确实显示了选择器对话框,但它不显示“始终”、“仅一次”选项。我怎样才能显示该选项?

谢谢!

【问题讨论】:

标签: android


【解决方案1】:

有一个肮脏的漂亮技巧可以让你做到这一点。 这个hack的灵感可以在here

找到

想法

是为了让 android 认为刚刚安装了一个新的浏览器,给它一个带有典型浏览器意图过滤器的假组件。 我将提供一个小测试用例作为概念验证,由您决定如何在实际应用程序中使用它。

建议的方法

似乎是通用的,适用于很多情况(不仅适用于启动器和浏览器),并且仅取决于提供给解析器的意图过滤器。

假设我们想要覆盖一个默认的 Activity 来浏览简单的 http:// 链接 我们将在 AndroidManifest.xml 中与真实的浏览器活动一起声明一个虚假的浏览器活动:

<activity
    android:name=".FakeActivity"
    android:enabled="false">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:scheme="http" />
        </intent-filter>
</activity>

FakeActivity 完全是空白:

public class FakeActivity extends Activity {}

我们将通过按下 activity_main.xml 中的一个简单按钮来显示应用选择器,并通过按下另一个按钮来测试默认行为:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    View changeDefaultButton = findViewById(R.id.changeDefButton);
    changeDefaultButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showChooser();
        }
    });

    View testDefaultButton = findViewById(R.id.testDefaultButton);
    testDefaultButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            runDefaultApp();
        }
    });
}


void showChooser(){

    PackageManager pm = getPackageManager();
    ComponentName cm = new ComponentName(this, FakeActivity.class);
    pm.setComponentEnabledSetting(cm, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

    runDefaultApp();

    pm.setComponentEnabledSetting(cm, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

}

void runDefaultApp(){
    Intent selector = new Intent(Intent.ACTION_VIEW);
    selector.setData(Uri.parse("http://stackoverflow.com"));
    startActivity(selector);
}

每次单击changeDefaultButton,都会显示选择器对话框(假设至少安装了两个合适的浏览器应用程序)。此外,选择器对话框始终允许用户将所选应用程序设置为默认应用程序

链接:

GitHub proof-of-concept project

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    您可以使用ACTION_CHOOSER 创建Intent,它是通过Intent.createChooser() 获得的,在方法参数中传递初始意图和标题。您可以通过在 Intent 数组中添加额外的 Intent.EXTRA_INITIAL_INTENTS 来向此选择器添加更多 Intent。

    【讨论】:

    • 这不会显示“始终”、“仅一次”选项。
    • @nubela 检查我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    相关资源
    最近更新 更多