Запустіть спеціальний додаток для Android із браузера Android


Відповіді:


616

Використовуйте елемент <intent-filter>з <data>елементом. Наприклад, щоб обробити всі посилання на twitter.com, ви покладете це всередині <activity>свого AndroidManifest.xml:

<intent-filter>
    <data android:scheme="http" android:host="twitter.com"/>
    <action android:name="android.intent.action.VIEW" />
</intent-filter>

Потім, коли користувач натисне на посилання, щоб твіттер у браузері, йому буде запропоновано, яку програму використовувати для завершення дії: браузер або ваша програма.

Звичайно, якщо ви хочете забезпечити тісну інтеграцію між вашим веб-сайтом та додатком, ви можете визначити власну схему:

<intent-filter>
    <data android:scheme="my.special.scheme" />
    <action android:name="android.intent.action.VIEW" />
</intent-filter>

Потім у своєму веб-додатку ви можете розмістити посилання:

<a href="my.special.scheme://other/parameters/here">

І коли користувач натисне на нього, ваш додаток буде запущено автоматично (адже він, ймовірно, буде єдиним, хто може обробляти my.special.scheme://тип сечовипускання). Єдиним недоліком цього є те, що якщо користувач не встановить додаток, він отримає неприємну помилку. І я не впевнений, що є спосіб перевірити.


Редагувати: Щоб відповісти на запитання, ви можете використовувати, getIntent().getData()який повертає Uriоб’єкт. Потім можна використовувати Uri.*методи для отримання потрібних даних. Наприклад, скажімо, що користувач натиснув посилання на http://twitter.com/status/1234:

Uri data = getIntent().getData();
String scheme = data.getScheme(); // "http"
String host = data.getHost(); // "twitter.com"
List<String> params = data.getPathSegments();
String first = params.get(0); // "status"
String second = params.get(1); // "1234"

Ви можете зробити вищезазначене де завгодно Activity, але, ймовірно, ви захочете це зробити onCreate(). Ви також params.size()можете отримати кількість сегментів шляху в Uri. Перегляньте javadoc або веб-сайт для розробників android для інших Uriметодів, які можна використовувати для вилучення конкретних деталей.


6
Дякую тонну за вашу швидку відповідь. Але ви можете, будь ласка, підкажіть, як отримати доступ до параметрів після "my.special.scheme: //".
Parimal Modi

4
Я відредагував свою відповідь, щоб включити інструкції, як витягти дані з Урі. Будь ласка, позначте цю відповідь прийнятою (лише), якщо ви вважаєте її так, натиснувши прапорець поруч.
Фелікс

9
що робити, якщо не встановлений цільовий додаток для Android? Як впоратися з цим.
Немо

13
Кожен, хто, як я, не в змозі змусити цю схему працювати, повинен додати android:exported="true"їх Activityдо маніфесту. Перевірте цю відповідь stackoverflow.com/a/13044911/1276636
Суфіан

4
Не впевнений, як це працює на весь світ. Просто не працює на chrome, і він завжди відкриває посилання в браузері, поки ви не розмістите елемент "android: pathPrefix". Відповідь все одно не має значень категорії, як зазначено в документації. Якщо це все ще не працює для когось, зверніться до цього, будь ласка: stackoverflow.com/a/21727055/2695276 PS: протягом багатьох днів бореться за це.
Раджат Шарма

70

Усі вищезазначені відповіді не працювали для мене CHROMEстаном на 28 січня 2014 року

мій додаток запустився належним чином із http://example.com/someresource/ посилань із таких додатків, як відеокімнати, gmail тощо, але не з хромового браузера.

щоб вирішити це, щоб він запускався належним чином із CHROME, ви повинні встановити такий фільтр намірів

<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:host="example.com"
        android:pathPrefix="/someresource/"
        android:scheme="http" />
    <data
        android:host="www.example.com"
        android:pathPrefix="/someresource/"
        android:scheme="http" />
</intent-filter>

зверніть увагу на pathPrefixелемент

ваш додаток тепер з’явиться в засобі вибору активності щоразу, коли користувач запитає http://example.com/someresource/ шаблон із хромового браузера, натиснувши посилання з результатів пошуку Google або будь-якого іншого веб-сайту


Це мені так допомогло. Дуже дякую! Будь ласка, опублікуйте свою відповідь тут, щоб я міг нагородити вас винагородою! stackoverflow.com/questions/21663001 / ...
Владу Schnakovszki

Яка мова це?
Дімс

Привіт, я знаю, що це занадто давно. Мене теж вражають за таким же сценарієм. Я вказав pathPrefix, схему та хост, але він не працює. Я спробував тільки зі схемою, тоді вона спрацювала. Але коли я додав хост, він перестав працювати. Будь-яка ідея, що може бути проблемою?
seema

Провели дні над цим, поки я не дійшов до цієї відповіді. Не впевнений, як це працювало для всього світу без елемента pathPrefix. Ніколи не працював у мене на хромі, незважаючи на те, що робив усе згідно документації. Дуже дякую.
Раджат Шарма

66

Будь ласка, дивіться мій коментар тут: Зробіть посилання в браузері Android, щоб запустити додаток?

Ми рішуче заважаємо людям використовувати власні схеми, якщо вони не визначають нову світову схему Інтернету.


10
Hackbod - один з інженерів Google за платформою Android. Це, мабуть, гарна ідея дотримуватися цієї поради. Насправді, схоже, підтримка користувальницької схеми на зразок цієї зламалась у стільниковій мережі.
nmr

23
Я не можу відповідати за обмеження, встановлені розробниками iOS. ;)
хакбод

12
відповідальність? ні. Але ви можете взяти це до уваги, оскільки, незалежно від того, подобається вам це чи ні, ці обмеження накладаються на багато ваших розробників
ByteMe

6
hackbod відповідає на питання спеціально для Android. Тут не згадується про iOS, тому не потрібно враховувати це.
nilskp

4
@hackbod буде називати схему (тобто href = "com.ourdomain.myapp // що завгодно") гарною практикою, припускаючи, що така посилання може бути знайдена на різних веб-сайтах?
Жульєн Берубе

48

У моєму випадку мені довелося встановити дві категорії для, <intent-filter>а потім це спрацювало:

<intent-filter>
<data android:scheme="my.special.scheme" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>

2
Те саме, що потрібно для додавання додаткової категорії.
КПК

Чи може хтось пояснити, що є власне процесом цього? Будь-яке посилання на точну реалізацію, передумови буде корисним. Спасибі
Ankit Garg

Тестується на налаштуваннях розробників. Насправді я давав неправильне доменне ім’я. Моє ліжко.
Анкіт Гарг

Відповідь з найкращими оцінками для мене не працював, але це все-таки вдалося. Дякую.
EL45

25

Наприклад, у вас є наступні речі:

Посилання, щоб відкрити ваш додаток: http://example.com

Назва пакету вашої програми: com.example.mypackage

Тоді вам потрібно зробити наступне:

1) Додайте фільтр намірів до своєї діяльності (може бути будь-яка діяльність, яку ви хочете. Для отримання додаткової інформації перегляньте документацію ).

        <activity
        android:name=".MainActivity">

        <intent-filter android:label="@string/filter_title_view_app_from_web">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <!-- Accepts URIs that begin with "http://example.com" -->

            <data
                android:host="example.com"
                android:scheme="http" />
        </intent-filter>

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity> 

2) Створіть файл HTML для тестування посилання або використання цих методів.

<a href="intent://example.com#Intent;scheme=http;package=com.example.mypackage;end">Open your Activity directly (just open your Activity, without a choosing dialog). </a>

<a href="http://example.com">Open this link with browser or your programm (by choosing dialog).</a>

3) Використовуйте мобільний Chrome для тестування

4) Це все.

І не потрібно публікувати додаток на ринку, щоб перевірити глибоке посилання =)

Також для отримання додаткової інформації перевірте документацію та корисну презентацію .


Мені довелося створити html-файл і завантажити його, щоб він працював. Цікаво, чому, особливо друга, не працює безпосередньо з браузера (chrome).
Макалеле

18

Також слід <category android:name="android.intent.category.BROWSABLE"/>додати у фільтр намірів, щоб активність розпізнавалася належним чином за посиланням.


4
Для довідки, додавання CATEGORY_BROWSABLE означає, що "Цільова активність може бути безпечно викликана браузером для відображення даних, на які посилається посилання - наприклад, зображення або повідомлення електронної пошти".
greg7gkb

Це вже існуюча категорія чи ви пропонуєте нову?
Аніш

Воно існує. Мабуть, у вас повинен бути окремий хост веб-сайту в різних тегах фільтрування намірів, інакше це спричиняє проблеми.
NoBugs

2
Не лише BROWSABLE, але також android.intent.category.DEFAULT - тому посилання можна було б відкрити, коли його ініціювали в інших додатках, наприклад електронному листі (не лише браузерах)
AlikElzin-kilaka

8

Наступне посилання містить інформацію про запуск програми (якщо вона встановлена) безпосередньо з браузера. В іншому випадку він безпосередньо відкриває додаток у магазині ігор, щоб користувач міг безперешкодно завантажувати.

https://developer.chrome.com/multidevice/android/intents


7

Зверніть увагу, якщо ваш значок зникне з запуску Android, коли ви реалізуєте цю функцію, ніж вам потрібно розділити фільтр намірів.

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <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="your-own-uri" />
        </intent-filter>
    </activity>


5

Xamarin порт Фелікса відповідь «пд.ш.

У свій MainActivityдодайте це ( документи: Android.App.IntentFilterAttribute Class ):

....
[IntentFilter(new[] { 
    Intent.ActionView }, 
    Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable }, 
    DataScheme = "my.special.scheme")
]
public class MainActivity : Activity
{
    ....

Xamarin додасть наступне AndroidManifest.xml:

<activity
    android:label="Something"
    android:screenOrientation="portrait"
    android:theme="@style/MyTheme"
    android:name="blah.MainActivity">
    <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="my.special.scheme" />
    </intent-filter>
</activity>

А щоб отримати парами ( я тестувався в OnCreate of MainActivity ):

var data = Intent.Data;
if (data != null)
{
    var scheme = data.Scheme;
    var host = data.Host;
    var args = data.PathSegments;

    if (args.Count > 0)
    {
        var first = args[0];
        var second = args[1];
        ...
    }
}

Наскільки мені відомо, вище можна додати будь-яку діяльність, не тільки MainActivity

Примітки:

  1. Коли користувач натискає посилання, ОС Android перезапустить ваш додаток (вбийте попередній екземпляр, якщо такий є, та запустіть новий) , це означає, що OnCreateподія програми MainLauncher Activityбуде запущена знову.
  2. З цим посиланням: <a href="my.special.scheme://host/arg1/arg2">в вище останнього коду значення сниппет буде:
scheme: my.special.scheme
host: host
args: ["arg1", "arg2"]
first: arg1
second: arg2

Оновлення: якщо android створює новий екземпляр вашої програми, ви також повинні додати android:launchMode="singleTask".


3

Підхід Фелікса до обробки глибоких посилань є типовим підходом до обробки глибоких посилань. Я б також запропонував перевірити цю бібліотеку для обробки маршрутизації та розбору ваших прямих посилань:

https://github.com/airbnb/DeepLinkDispatch

Ви можете використовувати анотації, щоб зареєструвати свою активність для певного URI глибокої посилання, і він буде витягувати параметри для вас без необхідності виконувати звичайну ригмаролу отримання сегментів шляху, узгодження його тощо. Ви можете просто анотувати та подібні дії :

@DeepLink("somePath/{someParameter1}/{someParameter2}")
public class MainActivity extends Activity {
   ...
}

0

Гей, я отримав рішення. Я не встановив категорію як "За замовчуванням". Також я використовував Основну діяльність для даних про наміри. Тепер я використовую іншу активність для даних про наміри. Дякую за допомогу. :)


Звуки малоймовірно (хоча я визнаю , що це старе питання , і , можливо , все змінилося.) З developer.android.com/guide/components/intents-filters.html#ifs «Для наміру пройти тест категорії, кожна категорія в Об'єкт наміру повинен відповідати категорії у фільтрі . Фільтр може перелічити додаткові категорії, але він не може опустити жодних, які є у намірі. "
Ноах Магедман

0

Вам потрібно додати псевдо-хост-ім’я до програми CALLBACK_URL '::' не має сенсу як URL-адреса і його неможливо проаналізувати.


0

example.php:

<?php
if(!isset($_GET['app_link'])){  ?>   
    <iframe src="example.php?app_link=YourApp://blabla" style="display:none;" scrolling="no" frameborder="0"></iframe>
    <iframe src="example.php?full_link=http://play.google.com/xyz" style="display:none;" scrolling="no" frameborder="0"></iframe>
    <?php 
}
else { ?>
    <script type="text/javascript">
    self.window.location        = '<?php echo $_GET['app_link'];?>';
    window.parent.location.href = '<?php echo $_GET['full_link'];?>';
    </script>
<?php 
}

1
Це створює два невидимих ​​рамки кадрів: глибоке посилання та звичайне посилання. Якщо додаток встановлено, запускається пряма посилання iframe. Якщо ні, відображається нормальне посилання. Завдяки додатковій роботі, відкладене глибоке посилання може бути реалізовано там, де виклик глибокого зв’язку після встановлення програми.
Домінік Серісано

0

Подивіться відповідь @JRuns тут . Ідея полягає у створенні html за власною спеціальною схемою та завантаженні її кудись. Потім, якщо ви натиснете на своє спеціальне посилання на вашому html-файлі, ви будете перенаправлені на ваш додаток. Я використав цю статтю для андроїд. Але не забудьте встановити Name = "MyApp.Mobile.Droid.MainActivity"атрибут повного імені для вашої цільової діяльності.


0

Станом на 15.06.2019

що я зробив, це включити всі чотири можливості відкрити URL.

тобто, з http/ httpsі 2 з wwwпрефіксом і 2 безwww

і за допомогою цього моє додаток автоматично запускається зараз, не вимагаючи вибрати браузер та інший варіант.

<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <data android:scheme="https" android:host="example.in" />
    <data android:scheme="https" android:host="www.example.in" />
    <data android:scheme="http" android:host="example.in" />
    <data android:scheme="http" android:host="www.example.in" />

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