Вопрос

Скажем, я хочу определить 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, которые пытаются жестко контролировать эти имена по уважительной причине — чтобы избежать конфликтов имен между различными объектами.Разместив ссылку на свою схему на веб-сайте, вы поместили это маленькое имя во все пространство имен Интернета и должны следовать этим стандартам.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top