Запустить собственное приложение для Android из браузера Android

Может ли кто-нибудь посоветовать мне, как запустить приложение для Android из браузера Android?


person Parimal Modi    schedule 02.06.2010    source источник


Ответы (16)


Используйте <intent-filter> с _ 2_ элемент. Например, чтобы обрабатывать все ссылки на 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">

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


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

person Felix    schedule 02.06.2010
comment
Большое спасибо за ваш быстрый ответ. Но не могли бы вы рассказать мне, как получить доступ к параметрам после my.special.scheme: //. - person Parimal Modi; 02.06.2010
comment
Я отредактировал свой ответ, включив в него инструкции по извлечению данных из Uri. Отметьте этот ответ как принятый (только), если вы так считаете, нажав на галочку рядом с ним. - person Felix; 02.06.2010
comment
у меня был аналогичный вопрос, потом я нашел ваш ответ, он идеален. У меня есть один недостаток: если я открою приложение, не щелкнув ссылку ... nullpointerexception ... поэтому я попытался проверить, являются ли данные нулевыми, а затем не пытайтесь получить данные, но это тоже не работает. Есть идеи, как решить эту незначительную проблему? - person Johan; 13.08.2010
comment
это один из самых полезных ответов на SO о веб-просмотрах Android - person SaKet; 25.08.2011
comment
действительно ли лучше поместить его в onCreate, чем в onResume ИЛИ в onNewIntent, когда действие использует режим запуска singleTop? - person Alexis; 11.09.2012
comment
что делать, если целевое приложение для Android не установлено? Как с этим справиться. - person Nemo; 14.09.2012
comment
как я могу применить это к мобильному гибридному приложению, основанному только на html5, css3 и javascript, для компиляции которого я использую веб-мармелад? Для этого подхода нет файла манифеста. - person Unomono; 06.02.2013
comment
Можно ли перехватить опубликованные данные, а не только URL? - person Mister Smith; 19.04.2013
comment
@MisterSmith нет, это специфично для HTTP. Но вы можете добавить данные к своему URL-адресу в виде параметров GET. - person Felix; 19.04.2013
comment
@Felix - Как вы анализируете параметры, если они передаются с uri, например www.blablabal.com/mycode.aspx?gameid=1232323? Спасибо... - person Dani; 25.01.2014
comment
@Dani проверьте getIntent (), getData () и объект Uri. - person Felix; 26.01.2014
comment
Любой, кто, как и я, не может заставить эту схему работать, должен добавить android:exported="true" к своему Activity в манифесте. Отметьте этот ответ stackoverflow.com/a/13044911/1276636 - person Sufian; 27.08.2014
comment
Привет, я знаю, что этот пост слишком старый, но не могли бы вы рассказать, как этого добиться при телефонном разговоре? - person fiberOptics; 21.10.2014
comment
Не уверен, как это работает для всего мира. Просто не работает в Chrome и всегда открывает ссылку в браузере, пока вы не разместите элемент android: pathPrefix. В любом случае ответ не имеет значений категорий, указанных в документации. Если это по-прежнему не работает для кого-то, обратитесь к этому, пожалуйста: stackoverflow.com/a/21727055/2695276 PS: боролся в течение нескольких дней над этим. - person Rajat Sharma; 03.01.2015
comment
Я не знаю, что он работает на всех устройствах, но не на Android Lollipop. Пожалуйста помоги - person Ahmad Arslan; 14.04.2015
comment
@Felix, это не работает на Android lollipop, пока ваша схема не будет http или https ... и если это так, он запускает приложение по умолчанию (браузер) и ничего не показывает, мое приложение никогда не запускается: / - person Salmaan; 14.04.2015
comment
Следует отметить, что функциональные возможности изменились после версии Chrome 25. Подробности см. На этой странице. о новом подходе. - person BaCaRoZzo; 24.05.2015
comment
@Felix, у меня аналогичная проблема stackoverflow.com/questions/35716173/ - person Aditya Vyas-Lakhan; 01.03.2016
comment
Обратите внимание, что теперь есть встроенный редактор, доступный для разработчика Android Studio. android.com/studio/write/app-link-indexing.html - person Dani; 03.12.2017
comment
@Felix При нажатии URL-адреса я получаю объект JSON, в котором я получу (MyApp: //? Screen = upgrade), поэтому в файле манифеста мне нужно написать только ‹данных android: scheme = MyApp android: host = screen = upgrade / ›Пожалуйста, помогите мне - person Atul Dhanuka; 22.01.2018
comment
@Felix, извините за комментарий выше, просто хочу спросить. Щелчок URL-сервера перенаправит меня на этот URL-адрес (MyApp: //? Screen = upgrade), поэтому в файле манифеста мне нужно написать только ‹данных android: scheme = MyApp android: host = screen = upgrade / ›пожалуйста, помогите мне - person Atul Dhanuka; 22.01.2018
comment
хост не важен, поэтому вы не можете его устанавливать. - person roghayeh hosseini; 11.10.2020

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

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

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

<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 или любого другого веб-сайта

person AndroidGecko    schedule 28.01.2014
comment
Это мне очень помогло. Большое спасибо! Отправьте свой ответ здесь, чтобы я мог наградить вас наградой! stackoverflow.com/ вопросы / 21663001 / - person Vlad Schnakovszki; 12.02.2014
comment
Что это за язык? - person Dims; 07.04.2014
comment
Привет, я знаю, что он слишком старый. Меня тоже поразил тот же сценарий. Я указал pathPrefix, scheme и host, но он не работает. Пробовал только по схеме, потом все получилось. Но когда я добавил хост, он перестал работать. Есть идеи, в чем может быть проблема? - person seema; 25.08.2014
comment
Я потратил на это несколько дней, пока не пришел к этому ответу. Не уверен, как это работало для всего мира без элемента pathPrefix. Никогда не работал у меня на Chrome, несмотря на то, что все делал в соответствии с документацией. Большое спасибо. - person Rajat Sharma; 03.01.2015

См. Мой комментарий здесь: Сделать ссылку в браузере Android запустить мое приложение?

Мы настоятельно не рекомендуем людям использовать свои собственные схемы, если только они не определяют новую всемирную схему Интернета.

person hackbod    schedule 12.08.2010
comment
Хакбод - один из инженеров Google, стоящих за платформой Android. Возможно, стоит последовать этому совету. Фактически, похоже, что такая поддержка пользовательских схем сломалась в Honeycomb. - person nmr; 04.10.2011
comment
Я считаю, что вам нужно создать свою собственную схему, если вы хотите, чтобы URL-адрес также работал на iPhone (например, из QR-кода). - person Lawrence Kesteloot; 16.05.2012
comment
Я не несу ответственности за ограничения, накладываемые iOS на разработчиков. ;) - person hackbod; 16.05.2012
comment
нести ответственность? нет. Но вы можете принять это во внимание, поскольку, независимо от того, нравится вам это или нет, эти ограничения накладываются на многих ваших разработчиков. - person ByteMe; 17.07.2012
comment
hackbod отвечает на вопрос специально для Android. Об iOS нет никакого упоминания, поэтому не нужно это учитывать. - person nilskp; 30.07.2012
comment
@hackbod будет использовать пространство имен схемы (например, href = com.ourdomain.myapp // что угодно), что является хорошей практикой, если предположить, что такую ​​ссылку можно найти на разных веб-сайтах? - person Julien Bérubé; 18.09.2012

В моем случае мне пришлось установить две категории для <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>
person Zaki    schedule 06.04.2011
comment
То же самое и здесь, необходимо добавить дополнительную категорию. - person KPK; 10.02.2012
comment
Может кто-нибудь объяснить, как на самом деле это делается? Любая ссылка на точную реализацию, предварительные условия будет полезна. Спасибо - person Ankit Garg; 06.11.2013
comment
Проверено при настройке разработчика. На самом деле я давал неправильное доменное имя. Виноват. - person Ankit Garg; 07.11.2013
comment
Ответ с наивысшим рейтингом не сработал для меня, но это сработало. Спасибо. - person EL45; 20.10.2014
comment
что такое ссылка href на стороне сервера? - person roghayeh hosseini; 11.10.2020

Например, у вас есть следующие вещи:

Ссылка для открытия вашего приложения: http://example.com

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

Тогда вам нужно сделать следующее:

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

    <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 для проверки ссылки или воспользуйтесь этими методами.

    Откройте Activity напрямую (просто откройте Activity без диалогового окна выбора).

    Откройте эту ссылку в браузере или в своей программе (выбрав диалоговое окно).

  3. Используйте Mobile Chrome для тестирования

  4. Вот и все.

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

Кроме того, для получения дополнительной информации ознакомьтесь с документацией и полезной презентация.

person Denshov    schedule 20.11.2015
comment
Мне пришлось создать html-файл и загрузить его, чтобы он заработал. Интересно, почему, особенно второй, не работает напрямую из браузера (хром). - person Makalele; 11.03.2017
comment
как отправить данные в приложение по этой ссылке? - person roghayeh hosseini; 11.10.2020

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

person georgij    schedule 16.07.2010
comment
Для справки: добавление CATEGORY_BROWSABLE означает, что целевое действие может быть безопасно вызвано браузером для отображения данных, на которые есть ссылка, например изображения или сообщения электронной почты. - person greg7gkb; 09.07.2012
comment
Это уже существующая категория или вы предлагаете новую? - person Anish; 14.08.2012
comment
Это существует. По-видимому, у вас должен быть отдельный хост веб-сайта в разных тегах фильтра намерений, иначе это вызовет проблемы. - person NoBugs; 14.10.2012
comment
Не только BROWSABLE, но и android.intent.category.DEFAULT - чтобы ссылку можно было открывать при запуске в других приложениях, например в электронной почте (а не только в браузерах). - person AlikElzin-kilaka; 30.12.2013

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

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

person Varun Bhatia    schedule 27.11.2013

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

Да, Chrome ищет вместо схемы. Если вы хотите запустить свое приложение через схему URI, используйте эту классную служебную программу в магазине Play. Это спасло мне день :) https://play.google.com/store/apps/details?id=com.naosim.urlschemesender

person RRK    schedule 10.04.2014

Xamarin ответа Феликса

Добавьте в свой MainActivity (docs: Android.App.IntentFilterAttribute Класс):

....
[IntentFilter(new[] { 
    Intent.ActionView }, 
    Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable }, 
    DataScheme = "my.special.scheme")
]
public class MainActivity : Activity
{
    ....

Xamarin добавит для вас в AndroidManifest.xml следующее:

<activity
    android:label="Something"
    android:screenOrientation="portrait"
    android:theme="@style/MyTheme"
    android:name="blah.MainActivity">
    <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="my.special.scheme" />
    </intent-filter>
</activity>

И чтобы получить параметры (я тестировал в OnCreate of MainActivity):

var data = Intent.Data;
if (data != null)
{
    var scheme = data.Scheme;
    var host = data.Host;
    var args = data.PathSegments;

    if (args.Count > 0)
    {
        var first = args[0];
        var second = args[1];
        ...
    }
}

Насколько я знаю, вышеуказанное можно добавить в любое действие, а не только в MainActivity

Примечания:

  1. Когда пользователь нажимает на ссылку, ОС Android перезапускает ваше приложение (уничтожает предыдущий экземпляр, если он есть, и запускает новый), означает, что событие OnCreate приложения MainLauncher Activity будет запущено снова.
  2. По этой ссылке: <a href="my.special.scheme://host/arg1/arg2"> в последнем фрагменте кода выше будут следующие значения:
scheme: my.special.scheme
host: host
args: ["arg1", "arg2"]
first: arg1
second: arg2

Обновление: если Android создает новый экземпляр вашего приложения, вам также следует добавить android:launchMode="singleTask".

person Mehdi Dehghani    schedule 15.03.2018

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

https://github.com/airbnb/DeepLinkDispatch

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

@DeepLink("somePath/{someParameter1}/{someParameter2}")
public class MainActivity extends Activity {
   ...
}
person Christian    schedule 02.07.2015

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

person Parimal Modi    schedule 03.06.2010
comment
Звучит маловероятно (хотя я понимаю, что это старый вопрос и, возможно, все изменилось). Из developer.android.com/guide/components/intents-filters.html#ifs Чтобы намерение пройти проверку категории, каждая категория в объекте Intent object должна соответствовать категория в фильтре. Фильтр может перечислять дополнительные категории, но не может опускать те, которые указаны в намерении. - person Noach Magedman; 18.04.2013

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

person Paul Lindner    schedule 07.06.2010

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 
}
person T.Todua    schedule 22.07.2014
comment
Это создает два невидимых окна iframe: ссылку на контент и обычную ссылку. Если приложение установлено, iframe с глубокой ссылкой запустит его. В противном случае отображается обычная ссылка. Приложив некоторые дополнительные усилия, можно реализовать отложенную глубокую ссылку, где глубокая ссылка вызывается после установки приложения. - person Dominic Cerisano; 03.12.2017

Посмотрите ответ @JRuns в здесь . Идея состоит в том, чтобы создать html с вашей собственной схемой и куда-нибудь загрузить. Затем, если вы нажмете на настраиваемую ссылку в своем html-файле, вы будете перенаправлены в свое приложение. Я использовал эта статья для Android. Но не забудьте установить атрибут полного имени Name = "MyApp.Mobile.Droid.MainActivity" для вашей целевой активности.

person S. Koshelnyk    schedule 29.06.2018

По состоянию на 15.06.2019

что я сделал, так это включил все четыре возможности для открытия URL.

то есть с http / https и 2 с www в префиксе и 2 без www

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

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

    <data android:scheme="https" android:host="example.in" />
    <data android:scheme="https" android:host="www.example.in" />
    <data android:scheme="http" android:host="example.in" />
    <data android:scheme="http" android:host="www.example.in" />

</intent-filter>
person Vicky Salunkhe    schedule 15.06.2019