понедельник, 11 июня 2012 г.

Узнаем источник установки приложения

При разработке программы в некоторых случаях бывает полезно знать из какого источника было установлено приложение. К примеру, есть несколько сайтов, с которых можно скачать одно и тоже приложение. С каждого сайта ссылка идет на Google Play. После установки приложения пользователем надо задать начальные настройки в зависимости от того, с какого сайта был осуществлен переход.


Андроид позволяет решить эту задачу, начиная с версии 1.6. В Google Analytics SDK реализован механизм отслеживания рекламной компании. В рамках этого механизма Google Play передает установленому приложению некоторую информацию через интент "com.android.vending.INSTALL_REFERRER". В приложение эту информацию можно стандартным методом получить и обработать:

AndroidManifest.xml
<receiver android:exported="true" android:name=".ReferrerReceiver">
    <intent-filter>
        <action android:name="com.android.vending.INSTALL_REFERRER">
    </action></intent-filter>
</receiver>
ReferrerReceiver.java
public class ReferrerReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
  if (intent.getAction().equals("com.android.vending.INSTALL_REFERRER")) {
   CharSequence contentText = intent.getExtras().getString("referrer");
   Toast.makeText(context, contentText, Toast.LENGTH_LONG).show();
  }
 }
}
Код в примере полностью рабочий, но между тем, во многих местах обсуждается, что данный механизм не работает. К примеру на Stack Overflow много вопросов на эту тему: раз, два. В багтрекере Андроид открыто несколько ошибок: раз, два.
Причина этих вопросов в том, что отсылка интента зависит от версии Андроила и, что более важно, от версии Google Play. Правила отсылки интента менялись из-за изменений в политике безопасности и на текущей момент надо учитывать два обстоятельства:
  1. Правильный формат ссылки на приложение в Google Play такой: http://market.android.com/details?id=com.package.name&referrer=text_will_be_send или market://details?id=com.package.name&referrer=text_will_be_send, если переходить по ссылке внутри приложения. Данные после парметра referrer будут переданы, данные после других параметров не учитываются.
  2. Начиная с 12-го уровня API (Андроид 3.1) у приложения в системе появился дополнительное состояние "остановленное" (“stopped” state). Если приложение находится в этом состоянии, то система не передает ему никакие интенты, кроме интента запуска "android.intent.action.MAIN". После этого приложение переходит в обычное состояние и начинает получать все интенты, на которое оно подписалось. Этот момент не очень четко отражен в официальной документации и я рекомендую прочитать статью на английском языке в блоге devmaze в которой описываются все детали.
    По этой причине на устройствах с Андроид 3.2 или Андроид 4.0 приложение получает интент "com.android.vending.INSTALL_REFERRER" только в момент первого запуска, а не сразу после установки.

Комментариев нет:

Отправить комментарий