Запустите пользовательское приложение для Android из браузера Android - PullRequest
398 голосов
/ 02 июня 2010

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

Ответы [ 16 ]

602 голосов
/ 02 июня 2010

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

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

68 голосов
/ 28 января 2014

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

мое приложение запущено должным образом из http://example.com/someresource/ ссылок из таких приложений, как видеовстречи, 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

ваше приложение теперь будет отображаться в окне выбора активности всякий раз, когда пользователь запрашивает шаблон 1014 *http://example.com/someresource/ из браузера Chrome, нажимая ссылку в результатах поиска Google или на любом другом веб-сайте

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

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

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

47 голосов
/ 06 апреля 2011

В моем случае мне пришлось установить две категории для <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>
21 голосов
/ 20 ноября 2015

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

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

<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) Используйте Mobile Chrome для проверки

4) Вот и все.

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

Также, для получения дополнительной информации, проверьте документацию и полезную презентацию .

18 голосов
/ 16 июля 2010

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

8 голосов
/ 27 ноября 2013

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

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

7 голосов
/ 11 июля 2014

Обратите внимание, что если ваша иконка исчезла из программы запуска 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>
6 голосов
/ 10 апреля 2014

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

5 голосов
/ 15 марта 2018

Xamarin порт Феликс ответ

В вашем MainActivity добавьте это ( документы: Класс 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="blahblahblah.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
...