Сделать ссылку в браузере 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>

Update: Ответ, который я принял, предоставленный 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>

Ответ 1

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

Затем вы сможете запустить приложение со ссылками, начинающимися с схемы URI anton:.

Ответ 2

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

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

Лучший способ использовать это, если вы хотите, чтобы он запускал только ваше приложение, - это ваше собственное действие с областью действия и использование Intent.setPackage(), чтобы сказать, что намерение будет соответствовать вашему приложению.

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

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

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

Ответ 3

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

Ответ 4

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

Это помогло мне и помогло вам.

Ответ 5

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

Ответ 6

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

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

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

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

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

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

Ответ 7

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

https://github.com/airbnb/DeepLinkDispatch

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

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

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

Ответ 8

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

        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: true" > < - "true" значение для имени файла класса

однако этот script работает для 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);
        }