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

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

15 ответов

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


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

Все приведенные выше ответы не работают для меня с 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 элемент

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

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

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

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

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

Ссылка для открытия вашего приложения: 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) Вот и все.

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

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

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

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

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

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

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

Ксамарин порт Феликса ответ

В вашем MainActivityДобавьте это (docs: https://developer.xamarin.com/api/type/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

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

https://github.com/airbnb/DeepLinkDispatch

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

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

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

По состоянию на 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>

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

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

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 
}
Другие вопросы по тегам