Як реалізувати власну схему URI на Android


161

Скажіть, я хочу визначити такий URI, як:

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

повинні оброблятись моєю власною заявою чи службою. Зауважте, що схема є "myapp"і ні "http", або "ftp". Це саме те, що я маю намір: визначити власну схему URI глобально для ОС Android. Чи можливо це?

Це дещо аналогічно тому, що деякі програми вже роблять, наприклад, системами Windows, такими як Skype ( skype://) або будь-яка програма для завантаження торентів ( torrent://).


Відповіді:


215

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


11
Мені знадобилося певний час, щоб зрозуміти, що для посилання на певний шлях, який змінна "android: path" повинна вказувати все після протоколу, тобто. це має бути виду "youtube.com/myvideo"
Casebash

2
Відмінно працює, але як я можу прочитати значення параметра GET "d", вказане в URL-адресі від MyUriActivity?
Тимо

не працює для мене. У мене є кілька фільтрів інтенції для однієї діяльності. Один для головного пускового пристрою. друге для відкриття певного файлу третього, як вище. Перші два працюють ідеально, але не треті.
mohitum

Будь ласка , ви можете подивитися на питання тут stackoverflow.com/q/29116574/3828908
Salmaan

1
Англійська мова версія вищенаведеного посилання на випадок, якщо комусь це потрібно.
Дзенсабуру

68

Доповнюючи відповідь @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");
}

що робити, якщо посилання схожа http://www.host.com/directory/value? Як ми можемо це отримати value?
Помилки трапляються

3
Ніколи не розум, отримав SO відповідь тут .
Помилки трапляються

Як читати теги даних у AndroidManifest.xml у коді без використання метаданих. Мені потрібно це, щоб відправити точну схему, шлях і хост до сервера також під час виклику oauth. Я не хочу дублювати декларацію зворотного дзвінка!
Pradeep Chakravarti Gudipati

@BugsHappen - це останній сегмент шляху URI. Використанняuri.getLastPathSegment();
Мартін

25

Настійно рекомендую не визначати власну схему. Це суперечить веб-стандартам схем URI, які намагаються жорстко контролювати ці імена з поважної причини - щоб уникнути конфліктів імен між різними об'єктами. Після того як ви розмістите посилання на вашу схему на веб-сайті, ви ввели це маленьке ім’я у весь простір імен Інтернету, і слід дотримуватися цих стандартів.

Якщо ви просто хочете мати посилання на свій власний додаток, я рекомендую вам дотримуватися описаного тут підходу:

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


2
Дякую за голову, але я буду використовувати це лише для того, щоб спробувати довести свою концепцію у закритому середовищі. Якщо цей експеримент коли-небудь піде з фази тестування, я обов'язково розглядаю можливість ратифікації всієї угоди.
punnie

5
Гаразд ... але чому б просто не зробити правильно? Це не якась значна більша робота.
хакбод

2
Youtube робить те, що пропонує @hackbod, але відкриття посилань Youtube з facebook відкриває браузер, а не додаток Youtube. Цей механізм занадто "делікатний"?
AlikElzin-kilaka

19
Я схиляюся до визначення власної схеми, щоб я міг використовувати ту саму логіку в Інтернеті, щоб запустити або додаток для iOS, або свій додаток для Android. Тільки мої 2 копійки
Chicowitz

1
@hackbod Я не думаю, що вони мали на увазі андроїд, коли писали цей rfc. Хоча я на 100% з вами, що не потрібно створювати нову схему, я вважаю, що причина саме в тому, що для досягнення мети навіть не потрібно. А тепер .. коли ти схожий на facebook, WhatsApp чи інші великі, встановлені інструменти tec - "не створювати нову URI-схему" - правило, звичайно, не стосується тебе. Не буде зіткнення з назвами схем, коли ваше ім’я вже прив’язане до компанії в глобальному масштабі.
icyerasor

6

Іншим альтернативним підходом до Дієго є використання бібліотеки:

https://github.com/airbnb/DeepLinkDispatch

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

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

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


1

Оскільки питання було задано багато років тому, і Android багато розвивається за цією схемою URI.
Від оригінальної схеми URI, до глибокого посилання, а тепер Android Посилання додатків.

Тепер Android рекомендує використовувати URL-адреси HTTP, а не визначати власну схему URI. Оскільки посилання для додатків Android використовують URL-адреси HTTP, які посилаються на ваш домен веб-сайту, тому жоден інший додаток не може використовувати ваші посилання. Ви можете перевірити порівняння прямих посилань та посилань на Android App тут

Тепер ви можете легко додати схему URI, скориставшись опцією Android Studio: Інструменти> Асистент посилання на додатки. Детальну інформацію див. У документі Android: https://developer.android.com/studio/write/app-link-indexing.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.