Как реализовать мою собственную схему URI на Android
Скажем, я хочу определить, что URI, например:
myapp://path/to/what/i/want?d=This%20is%20a%20test
должен обрабатываться моим собственным приложением или службой. Обратите внимание, что схема "myapp"
, а не "http"
, или "ftp"
. Это именно то, что я намереваюсь: определить мою собственную схему URI глобально для ОС Android. Возможно ли это?
Это несколько похоже на то, что уже делают некоторые программы, например, системы Windows, такие как Skype (skype://
) или любая программа загрузки торрентов (torrent://
).
Ответы
Ответ 1
Это очень возможно; вы определяете схему 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 (поскольку это требуется для всех неявных намерений). Также обратите внимание, как я добавил категорию BROWSABLE - это не обязательно, но это позволит вашим URI быть открываемыми из браузера (отличная функция).
Ответ 2
В дополнение к ответу @DanielLew, чтобы получить значения параметров, вы должны сделать это:
Пример 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");
}
Ответ 3
Я настоятельно рекомендую вам не определять свою собственную схему. Это противоречит веб-стандартам для схем URI, которые пытаются жестко контролировать эти имена по уважительной причине - избегать конфликтов имен между разными объектами. После того, как вы разместите ссылку на свою схему на веб-сайте, вы поместили это маленькое имя во все пространство имен в Интернете и должны следовать этим стандартам.
Если вы просто хотите иметь ссылку на свое приложение, я рекомендую вам следовать описанному здесь подходу:
Как зарегистрировать некоторое пространство имен URL (myapp://app.start/) для доступа к вашей программе, вызывая URL-адрес в браузере в ОС Android?
Ответ 4
Другой альтернативный подход к Диего - использовать библиотеку:
https://github.com/airbnb/DeepLinkDispatch
Вы можете легко объявить URI, которые вы хотите обработать, и параметры, которые вы хотите извлечь с помощью аннотаций в Activity, например:
@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
...
}
Кроме того, параметры запроса также будут переданы в Activity.
Ответ 5
Как вопрос задан много лет назад, и Android развивается по этой схеме URI.
От оригинальной схемы URI до глубокой ссылки, а теперь и ссылок на приложения для Android.
Android теперь рекомендует использовать HTTP-URL, а не определять собственную схему URI. Поскольку ссылки приложений Android используют URL-адреса HTTP, которые ссылаются на принадлежащий вам домен веб-сайта, никакое другое приложение не может использовать ваши ссылки. Вы можете проверить сравнение ссылок с глубокими ссылками и приложениями для Android здесь
Теперь вы можете легко добавить схему URI, используя опцию Android Studio: Инструменты> App Links Assistant. Пожалуйста, ознакомьтесь с подробностями в документе Android: https://developer.android.com/studio/write/app-link-indexing.html