Interceptando links do navegador para abrir meu aplicativo Android

107

Eu gostaria de poder solicitar que meu aplicativo abra um link quando o usuário clicar em um URL de um determinado padrão, em vez de permitir que o navegador o abra. Isso pode ocorrer quando o usuário está em uma página da web no navegador ou em um cliente de e-mail ou em um WebView em um aplicativo recém-criado.

Por exemplo, clique em um link do YouTube de qualquer lugar do telefone e você terá a chance de abrir o aplicativo do YouTube.

Como faço isso para meu próprio aplicativo?

Jamesh
fonte
Consulte também stackoverflow.com/questions/5065982/… .
CoolMind

Respostas:

141

Use um android.intent.action.VIEW da categoria android.intent.category.BROWSABLE .

No AndroidManifest.xml do aplicativo Photostream de Romain Guy ,

    <activity
        android:name=".PhotostreamActivity"
        android:label="@string/application_name">

        <!-- ... -->            

        <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:scheme="http"
                  android:host="flickr.com"
                  android:pathPrefix="/photos/" />
            <data android:scheme="http"
                  android:host="www.flickr.com"
                  android:pathPrefix="/photos/" />
        </intent-filter>
    </activity>

Uma vez dentro da atividade , você precisa procurar a ação e, em seguida, fazer algo com a URL que recebeu. O Intent.getData()método fornece um Uri.

    final Intent intent = getIntent();
    final String action = intent.getAction();

    if (Intent.ACTION_VIEW.equals(action)) {
        final List<String> segments = intent.getData().getPathSegments();
        if (segments.size() > 1) {
            mUsername = segments.get(1);
        }
    }

Deve-se notar, no entanto, que este aplicativo está ficando um pouco desatualizado (1.2), então você pode descobrir que existem maneiras melhores de fazer isso.

Jamesh
fonte
8
Uma coisa a ser observada - seu usuário terá a opção de usar o aplicativo adequado, já que tudo que você faz é registrar seu aplicativo como um manipulador. Pessoalmente (como usuário), estou incomodado com isso, embora perceba que posso optar por "ação padrão"
Bostone,
1
Isso não funciona com telefones HTC. Como posso fazer funcionar em telefones HTC?
user484691
57
Você provavelmente desejará usar intent.getDataString () em vez de getData () se você se preocupa com a URL completa, incluindo a string de consulta. Este comentário vai lhe poupar uma hora que acabou de me custar ... :-(
Kenton Price
Será chamado para cada URL para o qual o usuário navega a partir de qualquer aplicativo ou apenas do navegador nativo?
gonzobrains
1
De qualquer aplicativo (que usa a intenção Intent.ACTION_VIEW)
jamesh
2

Existem algumas bibliotecas que analisam os parâmetros do url automaticamente.

tal como

https://github.com/airbnb/DeepLinkDispatch

&&

https://github.com/mzule/ActivityRouter

O último é escrito por mim. Que pode analisar parâmetros para determinado tipo, nem sempre String.

Exemplo

@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 0);
Cao Dongping
fonte
0
private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        setUrlparams(url);

        if (url.indexOf("pattern") != -1) {
            // do something
            return false;
        } else {
            view.loadUrl(url);
        }

        return true;
    }

}
Dacx
fonte
4
Obrigado. Isso é útil no contexto em que você possui a visualização da web. A pergunta que eu estava fazendo era como faço meu aplicativo interceptar um clique em um link em qualquer aplicativo (por exemplo, o navegador).
jamesh