Как реализовать мою собственную схему URI на Android
скажем, я хочу определить, что URI, такие как:
myapp://path/to/what/i/want?d=This%20is%20a%20test
должен обрабатываться моим собственным приложением или службой. Обратите внимание, что схема "myapp"
, а не "http"
или "ftp"
. Это именно то, что я намереваюсь: определить свою собственную схему URI глобально для ОС Android. Это возможно?
это аналогично тому, что некоторые программы уже делают, например, в системах Windows, таких как Skype (skype://
) или любой торрент программой (torrent://
).
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, которые пытаются жестко контролировать эти имена по уважительной причине-чтобы избежать конфликтов имен между различными сущностями. Как только вы разместите ссылку на свою схему на веб-сайте, вы поместили это маленькое имя во все пространство имен всего интернета и должны следовать этим стандартам.
Если вы просто хотите иметь ссылку на свое собственное приложение, я рекомендую вам следуйте подходу, который я описал здесь:
другой альтернативный подход к Диего заключается в использовании библиотеки:
https://github.com/airbnb/DeepLinkDispatch
вы можете легко объявить URI, которые вы хотите обработать, и параметры, которые вы хотите извлечь через аннотации к действию, например:
@DeepLink("path/to/what/i/want") public class SomeActivity extends Activity { ... }
как плюс, параметры запроса также будут переданы вместе с активностью.