Перехват ссылок из браузера для открытия моего приложения для Android
-
05-07-2019 - |
Вопрос
Я хотел бы иметь возможность запрашивать у моего приложения открытие ссылки, когда пользователь нажимает на URL с заданным шаблоном, вместо того, чтобы разрешать браузеру открывать ее.Это может быть, когда пользователь находится на веб-странице в браузере, или в почтовом клиенте, или в WebView свежеиспеченного приложения.
Например, нажмите на ссылку YouTube из любого места телефона, и вам будет предоставлена возможность открыть приложение YouTube.
Как мне добиться этого для моего собственного приложения?
Решение
Используйте 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 ()
дает вам 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);
}
}
Следует отметить, однако, что это приложение немного устарело (1.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);
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;
}
}