Сделать ссылку в браузере Android для запуска моего приложения?

Можно ли сделать такую ​​ссылку как:

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

заставить мое приложение Anton запускаться?

Я знаю, что это работает для приложения 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>

10 ответов

Решение

Я думаю, что вы хотите посмотреть на <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.

Пожалуйста, НЕ используйте свою собственную схему! Схемы URI являются сетевым глобальным пространством имен. У вас есть схема "anton:" во всем мире? Нет? Тогда не используйте его.

Одним из вариантов является наличие веб-сайта и фильтр намерений для определенного 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(), чтобы сказать, что Intent будет соответствовать только вашему приложению.

Компромиссы между двумя:

  • Для http URI необходим домен, которым вы владеете. Пользователь всегда получит возможность показать URI в браузере. У него очень хорошие резервные свойства, при которых, если ваше приложение не установлено, они просто окажутся на вашем веб-сайте.

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

Я извиняюсь за продвижение себя, но у меня есть плагин 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>

Я также столкнулся с этой проблемой и вижу много абсурдных страниц. Я узнал, что для того, чтобы сделать ваше приложение доступным для просмотра, измените порядок элементов 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>

Это сработало для меня и может помочь вам.

Вот мой рецепт:

Создайте статический HTML-код, который перенаправляет на запрошенный URL-адрес приложения, и разместите эту страницу в Интернете.

Таким образом, ссылки, которыми вы делитесь, являются "реальными" ссылками в отношении Android (они будут "кликабельными").

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

Как только вы это запустите, вы можете дополнить HTML всеми необычными возможностями, как предложено выше.

Это работает со встроенным браузером, Opera и Firefox (не проверял ни один другой браузер). Firefox спрашивает: "Эту ссылку необходимо открыть с помощью приложения" (хорошо, отмена). Другие браузеры, очевидно, не слишком беспокоятся о безопасности, они просто открывают приложение, без вопросов.

Этот метод не вызывает диалоговое окно устранения неоднозначности с просьбой открыть приложение или браузер.

Если вы зарегистрируете в своем Манифесте

<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, которое должно быть вашим приложением.

Вы можете рассмотреть библиотеку для обработки глубокой ссылки на ваше приложение:

https://github.com/airbnb/DeepLinkDispatch

Вы можете добавить фильтр намерений к аннотированному действию, как это было предложено выше. Он будет обрабатывать маршрутизацию и анализ параметров для всех ваших глубоких ссылок. Например, ваша MainActivity может иметь что-то вроде этого:

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

Он также может обрабатывать параметры запроса.

Как только у вас есть намерение и настраиваемая схема 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.

Просто хотите открыть приложение через браузер? Вы можете добиться этого, используя приведенный ниже код:

HTML:

      <a href="intent:#Intent;action=packageName;category=android.intent.category.DEFAULT;category=android.intent.category.BROWSABLE;end">Click here</a>

Манифест:

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

Этот фильтр намерений должен быть в Launcher Activity.

Если вы хотите передать данные при нажатии на ссылку браузера, просто перейдите по этой ссылке .

Другие вопросы по тегам