2010-06-02 5 views

ответ

576

Используйте <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"> 

И когда пользователь нажмет на него, ваше приложение будет запущено автоматически (потому что оно, вероятно, будет единственным, которое может обрабатывать тип uris my.special.scheme://). Единственным недостатком этого является то, что если у пользователя нет установленного приложения, они получат неприятную ошибку. И я не уверен, что есть возможность проверить.


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

+5

Спасибо за тонну за ваш быстрый ответ. Но можете ли вы рассказать мне, как получить доступ к параметрам после «my.special.scheme: //». –

+4

Я отредактировал свой ответ, чтобы включить инструкции о том, как извлечь данные из Uri. Пожалуйста, отметьте этот ответ как принятый (только), если вы считаете это, нажав галочку рядом с ним. – Felix

+0

Очень удивительный очень полезный. – Anton

0

Эй, у меня есть решение. Я не задал категорию как «По умолчанию». Также я использовал основное действие для данных о намерениях. Теперь я использую другое действие для данных намерения. Спасибо за помощь. :)

+0

Звучит маловероятно (хотя я признаю, что это старый вопрос и, возможно, все изменилось.) С http://developer.android.com/guid e/components/intents-filters.html # ifs "Для намерения пройти тест категории, каждая категория в объекте Intent * * должна соответствовать категории в * filter *. Фильтр может перечислить дополнительные категории, но он не может опустить любые, которые находятся в намерении ». –

0

Вам нужно добавить псевдо-хост-имя в CALLBACK_URL 'приложение: //', не имеет смысла в качестве URL-адреса и не может быть проанализировано.

16

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

+3

Для справки добавление CATEGORY_BROWSABLE означает, что« целевая активность может быть безопасно вызвана браузером для отображения данных, на которые ссылается ссылка, например, изображение или сообщение электронной почты ». – greg7gkb

+0

Является ли это существующей категорией или вы предлагаете новую? – Anish

+0

Он существует. Очевидно, у вас должен быть отдельный хост веб-сайта в разных тегах фильтра намерений или он вызывает проблемы. – NoBugs

64

Пожалуйста, смотрите мой комментарий здесь: Make a link in the Android browser start up my app?

Мы решительно препятствовать людям использовать свои собственные схемы, если они не являются определяющими новой мировой схемой интернета.

+9

Hackbod является одним из инженеров Google, стоящих за платформой Android. Вероятно, это хорошая идея. этот совет. На самом деле, похоже, что поддержка пользовательских схем вроде этого сломалась в Honeycomb. – nmr

+1

Я считаю, что вам нужно создать свою собственную схему, если вы хотите, чтобы URL-адрес также работал на iPhone (например, с QR-кода). –

+23

Я не могу нести ответственность за ограничения, наложенные на разработчиков iOS. ;) – hackbod

47

В моем случае я должен был установить две категории для <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

Здесь же необходимо добавить дополнительную категорию. – KPK

+0

Может кто-нибудь объяснить, каков фактический процесс достижения этого? Любая ссылка на точную реализацию, предпосылки будут полезны. Спасибо –

+0

Протестировано на установке dev. На самом деле я давал неправильное доменное имя. Виноват. –

8

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

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

62

Все вышеперечисленные ответы не работает для меня с CHROME от 28 января 2014

мой App правильно запущен из http://example.com/someresource/ ссылок из приложений, таких как Hangouts, Gmail и т.д., но не внутри хромированной браузера.

, чтобы решить эту проблему, так что он начинает правильно от ХРОМ вы должны установить фильтр намерений, как этот

 <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/ шаблон из браузера Chrome, щелкнув ссылку из результатов поиска Google или любого другого сайта

+0

Это очень помогло мне. Большое спасибо! Пожалуйста, напишите свой ответ здесь, чтобы я мог наградить вас щедростью! http://stackoverflow.com/questions/21663001/launching-custom-android-application-from-android-browser-chrome –

+0

@ VladSchnakovszki thx, там u go :) – AndroidGecko

+0

На каком языке это? – Dims

6

Обратите внимание, что если ваш значок исчезает с панели запуска 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> 
+2

Как сделать эту работу для android lollipop? – Salmaan

+1

Ты только что спас мне жизнь, сэр @szines. Спасибо. – user1801879

+1

Это, похоже, не работает на lollipop – portfoliobuilder

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 
} 
+5

Можете ли вы объяснить, что должен делать этот код? –

+1

Это создает два невидимых фрейма: глубокую ссылку и нормальную ссылку. Если приложение установлено, он запустит глубокую ссылку iframe. Если нет, отображается нормальная ссылка. С дополнительной работой можно было отложить отложенную глубокую привязку, где после установки приложения вызывается глубокая ссылка. –

3

Феликса к обработке глубоких связей является типичным подходом к обработке глубоких связей. Я хотел бы также предлагаю проверить эту библиотеку для обработки маршрутизации и синтаксического анализа ваших глубоких ссылок:

https://github.com/airbnb/DeepLinkDispatch

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

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

Это лучший способ сделать это. – muntasir2000

16

к примеру, Вы имеете следующие вещи:

Ссылка, чтобы открыть приложение: http://example.com

Название пакета вашего приложения: com.example.mypackage

Тогда вам необходимо выполнить следующие действия:

1) Добавить фильтр намерений к вашей деятельности (Может быть любая деятельность, которую вы хотите. Для получения дополнительной информации проверьте documentation).

 <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-файл, чтобы проверить ссылку или использовать this methods.

<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) Вот так.

И его не нужно опубликовать приложение на рынке, чтобы проверить глубокие ссылки =)

Кроме того, для получения дополнительной информации, проверьте documentation и полезный presentation.

+0

Мне нужно было создать html-файл и загрузить его, чтобы он работал. Интересно, почему, особенно второй, не работает непосредственно из браузера (хром). – Makalele

Смежные вопросы