Запустите пользовательское приложение для 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"/>
добавлен в фильтр намерений для правильного распознавания активности по ссылке.
Следующая ссылка содержит информацию о запуске приложения (если оно установлено) непосредственно из браузера. В противном случае он напрямую открывает приложение в игровом магазине, так что пользователь может легко загрузить.
Обратите внимание, если ваш значок исчезнет из панели запуска 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
}