it-roy-ru.com

Как реализовать мою собственную схему URI на Android

Скажем, я хочу определить, что такой URI, как:

myapp://path/to/what/i/want?d=This%20is%20a%20test

должен обрабатываться моим собственным приложением или службой. Обратите внимание, что схема "myapp", а не "http" или "ftp". Это именно то, что я намереваюсь: определить мою собственную схему URI глобально для ОС Android. Это возможно?

Это в некоторой степени аналогично тому, что некоторые программы уже делают, например, в системах Windows, таких как Skype (skype://) или в любой программе для торрент-загрузчика (torrent://).

155
punnie

Это очень возможно; Вы определяете схему 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 из браузера (отличная функция).

209
Daniel Lew

В дополнение к ответу @ 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");
}
64
Diego Palomar

Я настоятельно рекомендую вам не определять свою собственную схему. Это противоречит веб-стандартам для схем URI, которые пытаются жестко контролировать эти имена по уважительной причине - чтобы избежать конфликтов имен между различными объектами. Разместив ссылку на свою схему на веб-сайте, вы поместили это маленькое имя во все пространство имен Интернета и должны следовать этим стандартам.

Если вы просто хотите иметь ссылку на свое собственное приложение, я рекомендую вам следовать подходу, который я описал здесь:

Как зарегистрировать некоторое пространство имен URL (myapp: //app.start/) для доступа к вашей программе, вызвав URL в браузере в Android ОС?

25
hackbod

Другой альтернативный подход к Диего - использовать библиотеку:

https://github.com/airbnb/DeepLinkDispatch

Вы можете легко объявить URI, которые вы хотите обработать, и параметры, которые вы хотите извлечь с помощью аннотаций в Activity, например:

@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
  ...
}

Кроме того, параметры запроса также будут переданы в Activity.

6
Christian

Поскольку вопрос задавался много лет назад, и Android очень развит в этой схеме URI.
От оригинальной схемы URI до глубокой ссылки, а теперь Android Ссылки приложения.

Android теперь рекомендует использовать HTTP-URL, а не определять собственную схему URI. Поскольку Android Ссылки приложений используют URL-адреса HTTP, которые ссылаются на принадлежащий вам домен веб-сайта, никакое другое приложение не может использовать ваши ссылки. Вы можете проверить сравнение глубоких ссылок и Android ссылок приложений из здесь

Теперь вы можете легко добавить схему URI с помощью параметра Android Studio: Инструменты> Помощник ссылок приложений. Подробную информацию см. В документе Android: https://developer.Android.com/studio/write/app-link-indexing.html

0
Weidian Huang