Перехоплення посилань із браузера, щоб відкрити мою програму Android


107

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

Наприклад, натисніть на посилання YouTube з будь-якої точки телефону, і ви отримаєте можливість відкрити додаток YouTube.

Як досягти цього для свого додатка?


Дивіться також stackoverflow.com/questions/5065982 / ... .
CoolMind

Відповіді:


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-адресу, включаючи рядок запитів. Цей коментар допоможе вам зекономити годину, яка просто коштувала мені ..... :-(
Кентон Ціна

Це буде викликано для кожної URL-адреси, до якої користувач переходить із будь-якої програми або просто з рідного браузера?
gonzobrains

1
З будь-якого додатка (який використовує наміри.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.