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.