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?


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.


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


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;
    }

}

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.