Как реализовать мою собственную схему URI на Android
-
20-09-2019 - |
Вопрос
Скажем, я хочу определить URI, например:
myapp://path/to/what/i/want?d=This%20is%20a%20test
должен обрабатываться моим собственным приложением или службой.Обратите внимание, что схема "myapp"
и не "http"
, или "ftp"
.Именно это я и намереваюсь:чтобы определить мою собственную схему URI глобально для ОС Android.Это возможно?
Это в некоторой степени аналогично тому, что уже делают некоторые программы, например, в системах Windows, такие как Skype (skype://
) или любую программу-загрузчик торрентов (torrent://
).
Решение
Это вполне возможно;вы определяете схему URI в своем AndroidManifest.xml, используя <data>
элемент.Вы настраиваете фильтр намерений с помощью <data>
элемент заполнен, и вы сможете создать свою собственную схему.(Подробнее о фильтрах намерений и разрешении намерений здесь..)
Вот краткий пример:
<activity android:name=".MyUriActivity">
<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="myapp" android:host="path" />
</intent-filter>
</activity>
В соответствии с тем, как работают неявные намерения, вам также необходимо определить хотя бы одно действие и одну категорию;здесь я выбрал VIEW в качестве действия (хотя это может быть что угодно) и обязательно добавил категорию DEFAULT (поскольку это требуется для всех неявных намерений).Также обратите внимание, как я добавил категорию ПРОСМОТР — в этом нет необходимости, но это позволит открывать ваши URI из браузера (отличная функция).
Другие советы
Дополняя @ДаниэльЛью ответ, чтобы получить значения параметров, вам нужно сделать это:
Пример URI: myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo
в вашей деятельности:
Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
Uri uri = intent.getData();
String valueOne = uri.getQueryParameter("keyOne");
String valueTwo = uri.getQueryParameter("keyTwo");
}
Я настоятельно рекомендую вам не определять свою собственную схему.Это противоречит веб-стандартам схем URI, которые пытаются жестко контролировать эти имена по уважительной причине — чтобы избежать конфликтов имен между различными объектами.Разместив ссылку на свою схему на веб-сайте, вы поместили это маленькое имя во все пространство имен Интернета и должны следовать этим стандартам.
Если вы просто хотите иметь ссылку на свое собственное приложение, я рекомендую вам следовать подходу, который я описал здесь:
Другой альтернативный подход Диего — использовать библиотеку:
https://github.com/airbnb/DeepLinkDispatch
Вы можете легко объявить URI, которые хотите обрабатывать, и параметры, которые хотите извлечь, с помощью аннотаций к действию, например:
@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
...
}
Плюсом является то, что параметры запроса также будут переданы в действие.
Поскольку вопрос был задан много лет назад, Android сильно развился по этой схеме URI.
От исходной схемы URI до глубоких ссылок, а теперь и ссылок на приложения Android.
Android теперь рекомендует использовать URL-адреса HTTP, а не определять собственную схему URI.Поскольку в ссылках приложений Android используются URL-адреса HTTP, которые ссылаются на принадлежащий вам домен веб-сайта, никакое другое приложение не сможет использовать ваши ссылки.Вы можете проверить сравнение глубоких ссылок и ссылок на приложения Android на странице здесь
Теперь вы можете легко добавить схему URI, используя опцию Android Studio:Инструменты > Помощник по ссылкам на приложения.Подробности см. в документе Android: https://developer.android.com/studio/write/app-link-indexing.html