Перехват ссылок из браузера для открытия моего приложения для Android


107

Я хотел бы иметь возможность предлагать моему приложению открывать ссылку, когда пользователь нажимает на URL-адрес заданного шаблона, вместо того, чтобы позволить браузеру открывать его. Это может быть, когда пользователь находится на веб-странице в браузере, в почтовом клиенте или в WebView в только что созданном приложении.

Например, щелкните ссылку YouTube из любого места на телефоне, и вам будет предоставлена ​​возможность открыть приложение YouTube.

Как мне добиться этого для моего собственного приложения?


Ответы:


141

Используйте android.intent.action.VIEW категории android.intent.category.BROWSABLE .

От Ромена Гая PhotoStream приложения AndroidManifest.xml ,

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

Оказавшись внутри вы в деятельности , вы должны смотреть на действия, а затем сделать что - то с URL вы были переданы. Intent.getData()Метод дает вам Ури.

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

Однако следует отметить, что это приложение немного устарело (1.2), поэтому вы можете найти более эффективные способы добиться этого.


8
Следует помнить об одном - вашему пользователю будет предложено выбрать подходящее приложение, поскольку все, что вам нужно сделать, это зарегистрировать свое приложение в качестве обработчика. Лично (как пользователь) меня это раздражает, хотя я понимаю, что могу выбрать «действие по умолчанию»
Bostone

1
Это не работает для телефонов HTC. Как заставить его работать на телефонах HTC?
user484691

57
Вы, вероятно, захотите использовать intent.getDataString (), а не getData (), если вам нужен полный URL-адрес, включая строку запроса. Этот комментарий сэкономит вам час, который мне просто стоил ..... :-(
Kenton Price

Будет ли это вызываться для каждого URL-адреса, по которому пользователь переходит из любого приложения или только из собственного браузера?
gonzobrains

1
Из любого приложения (использующего намерение Intent.ACTION_VIEW)
jamesh

2

Некоторые библиотеки автоматически анализируют параметры из URL.

Такие как

https://github.com/airbnb/DeepLinkDispatch

&&

https://github.com/mzule/ActivityRouter

Последний написан мной. Которая может анализировать параметры для данного типа, не всегда String.

пример

@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 0);

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
Спасибо. Это полезно в контексте, когда вы владеете веб-просмотром. Вопрос, который я задавал, заключался в том, как заставить мое приложение перехватывать щелчок по ссылке в любом приложении (например, в браузере).
jamesh
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.