android – 即使已经选择了默认应用程序,如何才能显示Default app chooser对话框?

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

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

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

谢谢.

更新在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)));

虽然它确实显示了选择器对话框,但它并未显示“始终”,“仅一次”选项.我该如何显示该选项?

谢谢!

最佳答案
有一个肮脏的漂亮的黑客,允许你这样做.
这个黑客的灵感可以找到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中的一个简单按钮来显示app选择器,并通过按另一个按钮来测试默认行为:

@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("https://stackoverflow.com"));
    startActivity(selector);
}

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

链接:

GitHub proof-of-concept project

希望这可以帮助.

转载注明原文:android – 即使已经选择了默认应用程序,如何才能显示Default app chooser对话框? - 代码日志