Есть ли способ передать сообщение из браузера Android в приложение? - PullRequest
11 голосов
/ 26 февраля 2011

У меня есть ситуация, когда я хотел бы, чтобы некоторые данные передавались с мобильного веб-сайта в нативное приложение Android. Сложность заключается в том, что в обычном случае родное приложение Android может не быть установлено при загрузке мобильного веб-сайта.

Вот пример:

Я являюсь пользователем ExampleApp и хочу поделиться с вами определенным фрагментом данных из ExampleApp, который никогда не устанавливал ExampleApp.

Я отправляю вам электронное письмо со ссылкой на мобильную веб-страницу, которая знает, какую часть данных вы хотите видеть при открытии ссылки. Но поскольку данные доступны только в собственном приложении, а не в мобильном Интернете, вы попадаете на страницу, на которой вам нужно перейти на Android Market и установить ExampleApp.

Вы устанавливаете ExampleApp, и в идеале вы будете перенаправлены непосредственно к части данных, которыми я с вами поделился.

Большая проблема заключается в разрыве между просмотром мобильной веб-страницы и установкой ExampleApp.

Я думал о паре решений, но ни одно из них не увенчалось успехом (при этом я мог просто неправильно их реализовать):

  1. Установите cookie на нашем домене, который включает данные при загрузке мобильной веб-страницы. Затем, когда ExampleApp откроется, запустите WebView, чтобы запросить страницу в том же домене, и проверьте значение файла cookie. Используйте это, чтобы определить, какой фрагмент данных показывать в ExampleApp.
  2. Используйте JavaScript localStorage, чтобы сохранить ссылку на фрагмент данных, и используйте WebView, чтобы получить страницу в этом домене и запросить содержимое localStorage из ExampleApp.

В обеих этих ситуациях кажется, что WebView и Браузер находятся друг от друга в песочнице, поэтому вы не можете получить доступ к cookies / localStorage между ними.

Есть ли какой-либо другой способ "покинуть крошку" или задать сообщение, к которому позднее установленное приложение сможет получить доступ из браузера?

РЕДАКТИРОВАТЬ: Учитывая некоторые ответы, я должен упомянуть, что я хочу, чтобы вы нажимали только один раз на ссылку, НЕ нужно было щелкать один раз, установите приложение, затем нажмите еще раз, чтобы открыть приложение в нужном месте.

Ответы [ 4 ]

10 голосов
/ 28 февраля 2012

Решение на самом деле довольно простое, я немного удивлен, что никто не смог придумать его более года. Итак, вот оно:

Основная идея - использовать куки для хранения информации. Поток данных выглядит следующим образом:

открыть веб-страницу -> установить cookie -> перенаправить на рынок -> установить приложение -> запустить браузер с веб-страницей -> прочитать cookie -> запустить пользовательское намерение с данными cookie -> захватить намерение и прочитать данные cookie

Пользователь посещает веб-страницу (например, сканируя QR-тег). URL-адрес веб-страницы содержит ссылку на данные, которые вы хотите передать, или содержит сами данные. Веб-сайт устанавливает данные в виде файла cookie и перенаправляет их на рынок Android (http://market.android.com/details?id=com.yourapp).. Как только ваше приложение запускается, вы открываете браузер и снова загружаете ту же веб-страницу. Однако на этот раз он обнаруживает, что файл cookie уже установить и перенаправить на пользовательскую схему URL, например, например: //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>

Кстати, я решил блог о проблеме.

4 голосов
/ 26 февраля 2011

Есть ли какой-либо другой способ "покинуть крошку" или задать сообщение, к которому позднее установленное приложение сможет получить доступ из браузера?

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

Шаг # 1: Создайте красивый RESTful URL, который содержит информацию, которую вы хотите. Под RESTful я имею в виду нет ?, нет #, ничего подобного. Будет немного проще, если это будет на отдельном доменном имени, но это может быть что-то в существующем домене. Для целей этого ответа я буду предполагать, что этот URL выглядит как http://android.exampleapp.com/our/custom/data/goes/in/here/somewhere.

Шаг # 2: Для всех URL-адресов, которые могут быть созданы в соответствии с шаблоном шага № 1 (что-либо в http://android.exampleapp.com), ваш веб-сервер должен отобразить страницу с надписью «Эй! У вас не установлено ExampleApp! Если нажмите эту ссылку здесь, и вы попадете в Android Market, где сможете установить ExampleApp! Затем попробуйте нажать на ссылку, которая привела вас на эту страницу, и она запустит ExampleApp и выдаст вам ... ммм ... все эти хорошие данные ".

Шаг # 3: Реализация действия в ExampleApp, в котором есть <intent-filter> с действием VIEW, категорией BROWSEABLE и элементом <data>, идентифицирующим вашу схему и домен (и, при необходимости, базу путь, если он будет одинаковым для всех этих ссылок).

Что видит пользователь, если у него не установлено приложение ExampleApp и щелкает ссылку, это ваша веб-страница, начиная с шага № 2, с которой он может перейти к установке ExampleApp.

То, что видит пользователь, если у него установлено приложение ExampleApp и щелкает ссылку, это ваша деятельность, которая может захватить URL через getIntent().getData() и сделать что-то полезное.


UPDATE

В комментарии вы написали:

мобильная веб-страница => хранить данные => пользователь устанавливает приложение => пользователь открывает приложение => приложение получает данные => приложение открывается непосредственно для извлеченного содержимого

ИМХО, вы делаете слишком много предположений о том, что собирается делать пользователь. Между стрелками, выделенными жирным шрифтом, могут быть дни, недели или месяцы задержки.

Если вы собираетесь распространять его самостоятельно (например, с вашего веб-сервера), у вас всегда есть возможность «записать» их в специальный APK-файл с данными внутри него, но тогда вам придется иметь дело с управлением обновлениями. сами.

Или, если вы используете систему на основе учетных записей, попросите их создать учетную запись на вашем сайте, прежде чем отправлять их в Android Market. Сохраните данные под этой учетной записью, и когда они подключатся к этой учетной записи из приложения, вы сможете сопоставить данные с приложением.

0 голосов
/ 21 августа 2012

См .: https://stackoverflow.com/a/7577379/710284

Вы можете использовать ссылку 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

0 голосов
/ 26 февраля 2011

Используйте параметр 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...