Iniciando um aplicativo Android a partir do navegador

Examinei várias perguntas sobre Stack Overflow com títulos semelhantes aos meus. Cada uma é respondida e o autor original parece satisfeito, mas quando tento replicar seus resultados, saio de mãos vazias. Obviamente, estou fazendo algo terrivelmente errado, mas não consigo entende

Para referência, estas são as perguntas que eu tenho pesquisado:

Launch Aplicativo Android personalizado do navegador AndroidFazer um link no navegador Android Iniciar meu aplicativo URL de retorno de chamada do desenvolvedor Android não está funcionandoAndroid Intent Filters: Como você usa a categoria de intenção pesquisável corretamente

Em última análise, quero usar isso para reiniciar meu aplicativo assim que o usuário executar uma solicitação de autenticação OAuth. No entanto, meu aplicativo real é um pouco grande demais para ser postado aqui. Para esta pergunta, montei um aplicativo simples para mostrar o que fiz. Eu tenho duas atividades Isso ocorre principalmente porque todos os exemplos que eu vi usam uma atividade usando a ação VIEW. Prefiro usar a ação MAIN, mas usei os dois aqui para mostrar que tentei os doi

AndroidManifest.xml (original; veja a versão editada abaixo)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.example" android:versionCode="1" android:versionName="1.0-SNAPSHOT">
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
    <activity android:name=".HelloAndroidActivity">
        <intent-filter>
            <data android:scheme="ex1"/>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <activity android:name=".CallbackActivity">
        <intent-filter>
            <data android:scheme="ex2"/>
            <action android:name="android.intent.action.VIEW"/>
        </intent-filter>
    </activity>
</application>

AndroidManifest.xml (Editado em resposta ao comentário)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.example" android:versionCode="1" android:versionName="1.0-SNAPSHOT">
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
    <activity android:name=".HelloAndroidActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <activity android:name=".CallbackActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/>
            <data android:host="www.this-so-does-not-exist.com" android:scheme="http" />
        </intent-filter>
    </activity>
</application>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

HelloAndroidActivity.java

package org.example;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;

public class HelloAndroidActivity extends Activity {

    private TextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView) findViewById(R.id.textView);
    }

    @Override
    public void onResume() {
        super.onResume();
        Intent intent = getIntent();
        Uri data = intent.getData();
        if (data != null) {
            textView.setText("Hello Web!");
        }
    }

}

CallbackActivity.java

package org.example;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;

public class CallbackActivity extends Activity {

    private TextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView) findViewById(R.id.textView);
    }

    @Override
    public void onResume() {
        super.onResume();
        Intent intent = getIntent();
        Uri data = intent.getData();
        if (data != null) {
            textView.setText("Hello Web!");
        }
    }

}

Este constrói feliz o suficiente. Então, dentro do navegador, se eu digitar ex1: // helloworld ou ex2: // helloworld, obtenho resultados diferentes dependendo de como isso é feito. Se eu inseri-lo na barra de URL, faço uma pesquisa no google por ex1: // helloworld. Se eu fizer isso através de um redirecionamento, recebo "Página da Web não disponível". Se eu tentar iniciar a intenção diretamente com algo semelhante a:

    Intent intent = new Intent(Intent.ACTION_MAIN);
    ComponentName componentName = new ComponentName(
            "org.example",
            "org.example.HelloAndroidActivity");
    intent.setComponent(componentName);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setData(Uri.parse("ex1://helloworld"));
    intent.addCategory(Intent.CATEGORY_BROWSABLE);
    startActivity(intent);

Recebo o padrão "Olá meu exemplo!". Não tenho certeza do que estou fazendo incorretamente. Alguma ideia?

questionAnswers(2)

yourAnswerToTheQuestion