Есть ли способ передать сообщение из браузера 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