Есть ли способ передать сообщение из браузера Android в приложение?
У меня есть ситуация, когда я хочу, чтобы некоторые данные передавались с мобильного веб-сайта в собственное приложение для Android. Усложнение состоит в том, что в обычном случае приложение для мобильных устройств Android не может быть установлено при загрузке мобильного веб-сайта.
Вот пример:
Я являюсь пользователем ExampleApp и хочу поделиться с вами некоторыми частями данных ExampleApp, которые никогда не устанавливали ExampleApp.
Я посылаю вам электронное письмо со ссылкой на мобильную веб-страницу, которая знает, какую часть данных вы хотите увидеть при открытии ссылки. Но поскольку данные доступны только в родном приложении, а не в мобильном Интернете, вы попадаете на страницу, которая просит вас перейти на Android Market и установить ExampleApp.
Вы устанавливаете ExampleApp, и в идеале вы должны быть взяты непосредственно к части данных, которую я поделил с вами.
Большая проблема заключается в отключении между просмотром мобильной веб-страницы и установкой ExampleApp.
Я подумал о нескольких решениях, но ни один из них не был успешным (я сказал, что я мог бы просто неправильно их реализовать):
- Установите cookie в нашем домене, который включает данные, когда загружается мобильная веб-страница. Затем, когда ExampleApp открывается, запустите WebView, чтобы запросить страницу в том же домене и проверить значение cookie. Используйте это, чтобы определить, какую часть данных показывать в ExampleApp.
- Используйте JavaScript localStorage для хранения ссылки на кусок данных и использования WebView для получения страницы в этом домене и запроса содержимого localStorage из ExampleApp.
В обеих этих ситуациях кажется, что WebView и браузер изолированы песочницами друг от друга, поэтому вы не можете получить файлы cookie/localStorage между ними.
Есть ли другой способ "оставить крошилку" или установить сообщение, которое приложение, установленное позже, может получить из браузера?
ИЗМЕНИТЬ: Учитывая некоторые из ответов, я должен упомянуть, что я хочу, чтобы вы только один раз щелкнули по ссылке, НЕ нужно щелкнуть один раз, установить приложение, а затем снова щелкнуть, чтобы открыть приложение в нужном месте.
Ответы
Ответ 1
Решение на самом деле довольно простое, я немного удивлен, что никто не смог придумать его больше года. Итак, вот оно:
Основная идея - использовать файлы cookie для хранения информации. Поток данных выглядит следующим образом:
открыть веб-страницу → установить cookie → перенаправить на рынок → установить приложение → запустить браузер с веб-страницей → прочитать cookie → начать настраивать намерение с данными cookie → ухватить намерение и прочитать данные cookie
Пользователь посещает веб-страницу (например, сканируя QR-тег). URL-адрес веб-страницы содержит ссылку на данные, которые вы хотите передать, или хранит сами данные. Веб-сайт устанавливает данные как cookie и перенаправляет на рынок Android (http://market.android.com/details?id=com.yourapp). Как только ваше приложение запустится, вы откроете браузер и снова загрузите ту же веб-страницу. Однако на этот раз он обнаруживает, что cookie уже установлен и перенаправляется на настраиваемую схему URL, например example://example.com/installed? Id = DATA, а не на рынок. Используя фильтр намерений, вы запускаете свою деятельность и извлекаете информацию из намерения.
Вот соответствующий код операции:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
if(intent == null || intent.getData() == null || !"example".equals(intent.getData().getScheme())) {
String url = "http://example.com/yourApp/index.php";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
finish();
return;
}else {
Uri uri = intent.getData();
if("example".equals(uri.getScheme())) {
id = uri.getQueryParameter("id");
}
}
... initialise your activity ...
}
Простой файл PHP (веб-сайт) для легкой демонстрации:
<?php
$value = "123";
if(!isset($_COOKIE["TestCookie"])) {
setcookie("TestCookie", $value, time()+3600); /* expire in 1 hour */
header("Location: http://market.android.com/details?id=com.yourapp");
exit;
}else {
header("Location: example://example.com/installed?id=".$_COOKIE["TestCookie"]);
exit;
}
?>
И фильтр намерений:
<!-- Handle URLs like loyalty://example.com/merchant/123 -->
<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="example" android:host="example.com" />
</intent-filter>
Кстати, я решил блог о проблеме.
Ответ 2
Есть ли другой способ "оставить крошилку" или установить сообщение, которое приложение, установленное позже, может получить из браузера?
Я думаю, что есть более простое решение - вариация, используемая сканером штрих-кода.
Шаг # 1: Создайте хороший URL RESTful, который содержит нужную вам информацию. По RESTful я имею в виду no ?
, no #
, ни один из этих дерьмов. Это будет проще, если это будет отличное имя домена, но это может быть что-то вроде вашего существующего домена. Для целей этого ответа я предполагаю, что этот URL-адрес выглядит как http://android.exampleapp.com/our/custom/data/goes/in/here/somewhere
.
Шаг # 2: для всех URL-адресов, которые могут быть созданы в соответствии с шаблоном шага №1 (что-либо в http://android.exampleapp.com
), ваш веб-сервер должен показывать страницу "Привет, у вас нет установленного APA! вы нажмете эту ссылку здесь, она перенесет вас на Android Market, где вы можете установить ExampleApp! Затем попробуйте нажать ссылку, которая привела вас на эту страницу, и она запустит ExampleApp и даст вам... ummm... все эти хорошие данные".
Шаг № 3: Внедрите операцию в ExampleApp, которая имеет <intent-filter>
с действием VIEW
, категорию BROWSEABLE
и элемент <data>
, идентифицирующий вашу схему и домен (и, при необходимости, базу путь, если это будет одинаково для всех этих ссылок).
То, что видит пользователь, если у них нет установленного приложения ExampleApp и нажмите ссылку, является вашей веб-страницей с шага №2, из которой они могут пойти, установите ExampleApp.
То, что пользователь видит, если у них есть установленный ExampleApp и нажмите ссылку, является вашей деятельностью, которая может захватить URL через getIntent().getData()
и сделать что-то полезное.
UPDATE
В комментарии вы писали:
мобильная веб-страница = > хранить данные = > пользователь устанавливает приложение = > пользователь открывает приложение = > приложение извлекает данные = > приложение открывается непосредственно к полученному содержимому
ИМХО, вы делаете слишком много предположений о том, что пользователь собирается делать. Между стрелками, выделенными жирным шрифтом, могут быть дни, недели или месяцы задержки.
Если вы собираетесь распространять его самостоятельно (например, с вашего веб-сервера), у вас всегда есть возможность "сжечь" их пользовательский APK с данными внутри него, но тогда вам придется иметь дело с управлением обновлениями сами.
Или, если вы собираетесь использовать систему на основе учетной записи, создайте учетную запись на своем сайте перед отправкой на Android Market. Храните данные в этой учетной записи, и когда они подключаются к этой учетной записи из приложения, вы можете сопоставить данные с приложением.
Ответ 3
Используйте параметр GET: http://exampleapps.com?token=mK7Fyt5 Подумайте о том, как работает приложение YouTube. Вы отправили ссылку на видео. Если у вас нет приложения YouTube, вы видите мобильный сайт (который в вашем случае может быть ссылкой на установку). Если вы это сделаете, вас спросят, следует ли открыть ссылку YouTube с помощью собственного приложения, а родному приложению передается URL-адрес, с которого он был выведен, из которого он может проанализировать параметр для показа видео.
Используйте следующий фильтр намерений:
<intent-filter>
<data android:scheme="http" android:host="exampleapps.com"/>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
Ответ 4
Смотрите: fooobar.com/info/470351/...
Вы можете использовать ссылку INSTALL_REFERRER, например:
http://market.android.com/details?id=your.package.name&referrer=your_wanted_parameter
После того, как пользователь нажмет эту ссылку и установит приложение, ваш широковещательный приемник получит трансляцию com.android.vending.INSTALL_REFERRER с параметром "your_wanted_parameter".
Дополнительная информация:
http://code.google.com/mobile/analytics/docs/android/#android-market-tracking
Получить реферер после установки приложения из Android Market
Получить тег реферера Google Analytics Android