Может ли кто-нибудь посоветовать мне, как запустить приложение для Android из браузера Android?
Запустить собственное приложение для Android из браузера Android
Ответы (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
методах, которые можно использовать для извлечения определенных частей.
android:exported="true"
к своему Activity
в манифесте. Отметьте этот ответ stackoverflow.com/a/13044911/1276636
- person Sufian; 27.08.2014
Все вышеперечисленные ответы не работали для меня с 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 или любого другого веб-сайта
См. Мой комментарий здесь: Сделать ссылку в браузере 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
Тогда вам нужно сделать следующее:
Добавьте фильтр намерений в свою активность (может быть любое действие, которое вы хотите. Для получения дополнительной информации см. документация).
<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>
Создайте файл HTML для проверки ссылки или воспользуйтесь этими методами.
Откройте Activity напрямую (просто откройте Activity без диалогового окна выбора).
Откройте эту ссылку в браузере или в своей программе (выбрав диалоговое окно).
Используйте Mobile Chrome для тестирования
Вот и все.
И не обязательно публиковать приложение на рынке, чтобы протестировать диплинкинг =)
Кроме того, для получения дополнительной информации ознакомьтесь с документацией и полезной презентация.
Также необходимо добавить <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, используйте эту классную служебную программу в магазине Play. Это спасло мне день :) https://play.google.com/store/apps/details?id=com.naosim.urlschemesender
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
Примечания:
- Когда пользователь нажимает на ссылку, ОС Android перезапускает ваше приложение (уничтожает предыдущий экземпляр, если он есть, и запускает новый), означает, что событие
OnCreate
приложенияMainLauncher Activity
будет запущено снова. - По этой ссылке:
<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"
.
Подход Феликса к работе с глубокими ссылками - это типичный подход к работе с глубокими ссылками. Я также предлагаю проверить эту библиотеку для обработки и анализа ваших глубоких ссылок:
https://github.com/airbnb/DeepLinkDispatch
Вы можете использовать аннотации для регистрации вашего Activity для определенного URI глубинной ссылки, и он будет извлекать параметры для вас без необходимости выполнять обычную болтовню по получению сегментов пути, сопоставлению их и т. Д. Вы можете просто аннотировать и выполнять подобные действия :
@DeepLink("somePath/{someParameter1}/{someParameter2}")
public class MainActivity extends Activity {
...
}
Привет, я нашел решение. Я не устанавливал категорию как «По умолчанию». Также я использовал основное действие для данных намерения. Теперь я использую другое действие для данных о намерениях. Спасибо за помощь. :)
Вам нужно добавить псевдо-имя хоста в CALLBACK_URL 'app: //' не имеет смысла в качестве URL-адреса и не может быть проанализирован.
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
}
Посмотрите ответ @JRuns в здесь . Идея состоит в том, чтобы создать html с вашей собственной схемой и куда-нибудь загрузить. Затем, если вы нажмете на настраиваемую ссылку в своем html-файле, вы будете перенаправлены в свое приложение. Я использовал эта статья для Android. Но не забудьте установить атрибут полного имени Name = "MyApp.Mobile.Droid.MainActivity"
для вашей целевой активности.
По состоянию на 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>