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


229

Чи можливо зробити посилання типу:

<a href="anton://useful_info_for_anton_app">click me!</a>

викликати запуск мого додатка Антона?

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

Ось приклад посилання, яке запустить Android Market:

<a href="market://search?q=pname:com.nytimes.android">click me!</a>

Оновлення: відповідь, яку я прийняв, наданий eldarerathis, прекрасно працює, але я просто хочу зазначити, що у мене виникли певні проблеми з порядком підрядів <intent-filter>тегів. Я пропоную вам просто зробити ще один <intent-filter>із новими субелементами в цьому тезі, щоб уникнути проблем, які виникли у мене. Наприклад, моє AndroidManifest.xmlвиглядає так:

<activity android:name=".AntonWorld"
          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>
        <data android:scheme="anton" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Це вирішило мою проблему, коли я не можу відкрити додаток у своєму мобільному телефоні.
Unomono

9
+1 для згадування впорядкування тегів xml. Це абсолютно не має сенсу і ніде не задокументовано, але я виявив, що коли у мене є тег даних нижче тегів дій та категорій, він просто не працює.
Адам

Перенаправлення на додаток та правильне відмовлення, якщо його немає, може бути і кошмаром, враховуючи складність усіх різних браузерів Android (Chrome, Default, Webviews, Firefox тощо). Branch.io послуга допомагає зробити це безкоштовно.
Алекс Остін

@Anton .... привіт сер ... за вашим вище кодом, я розумію лише обробку даних за посиланням ... Чи можете ви мені сказати, як я можу створити посилання, яке містить мої дані ... будь ласка, допоможіть я ... Я хочу створити посилання з даними про подію на натискання кнопки ..
Ravindra Kushwaha

1
⚠️ Я натрапив на перешкоду налагодження, про яку можуть бути в курсі й інші: посилання працюють із <a href=""> посилань на веб-сторінках і при запуску за допомогою adb, але тепер, коли ви просто вводите URL у мобільному телефоні адресний рядок браузера.⚠️
Йоганнес Бродволл

Відповіді:


96

Думаю, ви захочете переглянути <intent-filter>елемент вашого файлу Mainfest. Зокрема, погляньте на документацію для цього <data>елемента.

В основному, вам потрібно буде визначити власну схему. Щось у напрямку:

<intent-filter>
    <data android:scheme="anton" />
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" /> <--Not positive if this one is needed
    ...
</intent-filter>

Тоді ви зможете запустити додаток із посиланнями, які починаються зі anton:схеми URI.


3
Спробуйте поглянути на цю нитку. Він має досить хороший приклад: stackoverflow.com/questions/2958701 / ...
eldarerathis

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

3
Це чудово працює на попередніх версіях Android, але не на льодяник, будь-яке рішення?
Сальман

1
@eldarerath Це працює, якщо програма закрита, але якщо програма працює на задньому плані, а активність відрізняється від тієї, до якої додається фільтр намірів, я не можу це впоратися. Як вам вдається це працювати для всіх видів діяльності? Чи поміщаєте ви фільтр намірів у всі з них?
Мустафа Гювен

5
Ця відповідь застаріла. Це не буде працювати після хрому 40. Спеціальна схема відключена в хромі через проблеми безпеки
Utsav Gupta,

280

Будь ласка, НЕ використовуйте власну власну схему на зразок такої !!! Схеми URI - це мережевий глобальний простір імен. Ви володієте схемою "антон:" у всьому світі? Немає? Тоді НЕ використовуйте його.

Один із варіантів - створити веб-сайт та мати фільтр намірів для певного URI на цьому веб-сайті. Наприклад, це те, що Market робить для перехоплення URI на своєму веб-сайті:

        <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="http" android:host="market.android.com"
                android:path="/search" />
        </intent-filter>

Як варіант, існує схема "наміри:". Це дозволяє описати майже будь-який Намір як URI, який браузер спробує запустити при натисканні. Щоб побудувати таку схему, найкращий спосіб - просто написати код для побудови запущеного наміру, а потім надрукувати результат intent.toUri (Intent.URI_INTENT_SCHEME).

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

Найкращий спосіб використовувати це, якщо ви хочете переконатися, що він запускає лише ваш додаток, - це власною діями в масштабі та використанням Intent.setPackage (), щоб сказати, що Намір буде відповідати лише вашому пакету програм.

Компроміси між двома:

  • http URI вимагає наявності у вас домену. Користувач завжди отримає можливість показу URI у браузері. Він має дуже приємні резервні властивості, де, якщо ваша програма не буде встановлена, вони просто приземляться на ваш веб-сайт.

  • URI для намірів вимагають, щоб ваш додаток уже було встановлено і лише на телефонах Android. Дозволити майже будь-які наміри (але завжди включати категорію BROWSABLE та не підтримувати явні компоненти). Вони дозволяють спрямовувати запуск лише на ваш додаток, не маючи можливість користувача перейти до браузера чи будь-якого іншого додатка.


32
З іншого боку, додаток Market також обробляє market://посилання :)
Фелікс

38
Для нього було помилкою використання ринку :, і це видаляється.
hackbod

82
Причина, через яку люди використовують спеціальні схеми в Android, полягає в тому, що більшість проектів розробляються паралельно з (або після) версією iPhone, і це єдиний спосіб змусити її працювати там ...
LambergaR

12
погоджуюся з @LambergaR. Тепер нам потрібно знайти спосіб посилання на роботу електронною поштою на 3 платформах (BB, iphone, Android)
Maragues

7
Будь-який URI, який ви розмістите на своїй веб-сторінці за допомогою спеціальної схеми, не працюватиме в будь-якому веб-браузері, на якому також не встановлено вашу програму. Це не здається вам зламаним?
хакбод

13

Прошу вибачення за те, що рекламую себе, але у мене є плагін jQuery для запуску власних програм із веб-посилань https://github.com/eusonlito/jquery.applink

Ви можете використовувати це легко:

<script>
$('a[data-applink]').applink();
</script>

<a href="https://facebook.com/me" data-applink="fb://profile">My Facebook Profile</a>

12

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

<activity
    android:name="com.example.MianActivityName"
    android:label="@string/title_activity_launcher">

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

    <intent-filter>                
        <data android:scheme="http" />     
        <!-- or you can use deep linking like  -->               

        <data android:scheme="http" android:host="xyz.abc.com"/>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <category android:name="android.intent.category.DEFAULT"/>

    </intent-filter>
</activity>

Це працювало на мене і може вам допомогти.


Я пишу тег XML у тій же послідовності, але не можу відкрити діалогове вікно вибору, коли я пишу свій URL у браузері Android.
Суніт Кумар Гупта

Я не бачив великої різниці, і якщо я використовую цей, він працює чудово. Дякую :)
Muthu S

6

Ось мій рецепт:

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

Таким чином, посилання, якими ви ділитесь, - це "реальні" посилання на Android (вони можуть бути "кліковими").

Ви "ділитесь" звичайним HTTP-посиланням www.your.server.com/foo/bar.html Ця URL-адреса повертає простий 8-рядковий HTML, який переспрямовує до URI вашого додатка (window.location = "blah: // kuku") ( зауважте, що "blah" більше не має бути HTTP або HTTPS).

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

Це працює із вбудованим браузером, Opera та Firefox (не перевіряли жоден інший браузер). Firefox запитує "Це посилання потрібно відкрити програмою" (добре, скасувати). Інші браузери, мабуть, не так хвилюються щодо безпеки, вони просто відкривають додаток, без запитань.


Чудово! Це працювало для мене. Тож ми додали HTML-сторінку із посиланням на користувальницьку схему, яка переспрямовує до мого додатка. Моє посилання<a href="iamnearby://register_activate">Activate</a>
С. Кошельник

4

Після того, як у вас налаштована спеціальна схема набору URL-адрес для вашого додатка, цей код JavaScript у верхній частині сторінки прийому працював для мене як на iOS, так і на Android:

<script type="text/javascript">
// if iPod / iPhone, display install app prompt
if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i) ||
    navigator.userAgent.match(/android/i)) {
  var store_loc = "itms://itunes.com/apps/raditaz";
  var href = "/iphone/";
  var is_android = false;
  if (navigator.userAgent.match(/android/i)) {
    store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";
    href = "/android/";
    is_android = true;
  }
  if (location.hash) {
    var app_loc = "raditaz://" + location.hash.substring(2);
    if (is_android) {
      var w = null;
      try {
        w = window.open(app_loc, '_blank');
      } catch (e) {
        // no exception
      }
      if (w) { window.close(); }
      else { window.location = store_loc; }
    } else {
      var loadDateTime = new Date();
      window.setTimeout(function() {
        var timeOutDateTime = new Date();
        if (timeOutDateTime - loadDateTime < 5000) {
          window.location = store_loc;
        } else { window.close(); }
      },
      25);
      window.location = app_loc;
    }
  } else {
    location.href = href;
  }
}
</script>

Це було протестовано лише в браузері Android. Я не впевнений у Firefox чи Opera. Ключ навіть незважаючи на те, що браузер Android не викине для вас приємне виняток window.open(custom_url, '_blank'), він вийде з ладу і повернеться, nullщо ви можете протестувати пізніше.

Оновлення: за допомогою store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";посилання на Google Play на Android.


1
який сенс loadDateTime / timeOutDateTime? Це якось обходить блокатори спливаючих вікон чи щось таке?
Метт Вулф

це, здається, не працює в моїх тестах, window.open (...) завжди відкриє нове вікно, навіть якщо схема не обробляється.
jtomson

@MattWolfe вибачте за пізню відповідь. На iPhone (Safari) не виключається виняток. Час очікування є, щоб закрити застаріле вікно в Safari, яке залишилося після перенаправлення сторінки на додаток. Я не знайшов способу відкрити URL-адресу, не проходячи Safari та більшість інших програм, які розпізнають такі URL-адреси, робити те саме. Це було однією з переваг «глибокого зв’язку» з Facebook: ви не отримаєте того затхлого вікна, що залишився, щоб пройти через мобільний Safari.
Піт

@jtomson: Цікаво. Я тестував на Емуляторі та різних пристроях від Android 2.1 до 3 (на той час). На якому пристрої та версії Android ви тестували?
Піт

4

Ви можете розглянути питання про бібліотеку, яка обробляє пряме посилання на ваш додаток:

https://github.com/airbnb/DeepLinkDispatch

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

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

Він також може обробляти параметри запиту.


1

Спробуйте мій простий трюк:

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if(url.startsWith("classRegister:")) {                  
                Intent MnRegister = new Intent(getApplicationContext(), register.class); startActivity(MnRegister);
            }               
            view.loadUrl(url);
            return true;
        }

і моє html посилання:

<a href="classRegister:true">Go to register.java</a>

або ви можете зробити <A HREF = «classRegister: правда »> <- «істина» значення для класу файлу

однак цей сценарій працює для поштового посилання :)

        if (url.startsWith("mailto:")) {
            String[] blah_email = url.split(":");
            Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
            emailIntent.setType("text/plain");
            emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{blah_email[1]});
            emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, what_ever_you_want_the_subject_to_be)");
            Log.v("NOTICE", "Sending Email to: " + blah_email[1] + " with subject: " + what_ever_you_want_the_subject_to_be);
            startActivity(emailIntent);
        }

Це по суті заклик до a JavascriptInterfaceз вирішенням, це правильне рішення, якщо вам потрібно підтримати 2.3, де виправлено JavascriptInterface.
EpicPandaForce

1

Цей метод не викликає діалогове вікно розмитнення з проханням відкрити або додаток, або браузер.

Якщо ви зареєструєте таке у своєму Маніфесті

<manifest package="com.myApp" .. >
  <application ...>
    <activity ...>
      <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="gallery"
          android:scheme="myApp" />
      </intent-filter>
    </activity>
    ..

і натисніть, наприклад, цю URL-адресу з електронного листа на телефоні

<a href="intent://gallery?directLink=true#Intent;scheme=myApp;package=com.myApp;end"> 
  Click me 
</a>

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


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