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

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

<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>

Обновление: Ответ, который я принял, предоставленный eldarera, отлично работает, но я просто хочу упомянуть, что у меня были некоторые проблемы с порядком подэлементов тега <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>

Ответы [ 8 ]

269 голосов
/ 13 августа 2010

Пожалуйста, НЕ используйте такую ​​собственную схему!Схемы 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 и не поддерживать явные компоненты).Они позволяют направить запуск только на ваше приложение, при этом у пользователя нет возможности вместо этого перейти в браузер или любое другое приложение.

94 голосов
/ 12 августа 2010

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

13 голосов
/ 10 сентября 2013

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

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

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

6 голосов
/ 07 октября 2012

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

Создайте статический 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 спрашивает: «Эту ссылку нужно открыть с помощью приложения» (хорошо, отмена).Другие браузеры, очевидно, не слишком беспокоятся о безопасности, они просто открывают приложение, без вопросов.

4 голосов
/ 02 июля 2015

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

https://github.com/airbnb/DeepLinkDispatch

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

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

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

4 голосов
/ 23 ноября 2011

Как только вы настроите намерение и собственную схему 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 голос
/ 19 ноября 2011

Попробуйте мой простой трюк:

        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>

или вы можете задать true "> <- "true" для имени файла класса </p>

однако этот скрипт работает для mailto link:)

        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);
        }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...