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


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

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

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

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

4 140

4 ответа:

Это очень возможно; вы определяете схему 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>

согласно тому, как работают неявные намерения, вам нужно определить хотя бы одно действие и одну категорию; здесь я выбрал Просмотрите как действие (хотя это может быть что угодно) и обязательно добавьте категорию по умолчанию (поскольку это требуется для всех неявных намерений). Также обратите внимание, как я добавил категорию BROWSABLE - это не обязательно, но это позволит вашим URI быть открытыми из браузера (отличная функция).

дополнения @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");
}

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

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

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

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

https://github.com/airbnb/DeepLinkDispatch

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

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

как плюс, параметры запроса также будут переданы вместе с активностью.