2012-06-11 64 views
12

假設我有一個安裝在用戶設備中的Android應用A,並且我的應用有一個AppWidget,我們讓其他Android開發人員發佈他們的應用以每次安裝費用爲基礎的促銷廣告。因此,我們需要通過App A的推薦來跟蹤用戶設備上是否安裝了應用B.Android應用程序A想要跟蹤用於Android應用B安裝的Google Play推介數據

我們還假設Android App B的廣告在Android App A的小部件上運行,並且我們將App A的用戶重定向到App B的用戶到Google Play的鏈接與所有引薦數據一起使用。該URL看起來像這樣(推薦here -

https://play.google.com/store/apps/details?id=com.joelapenna.foursquared&referrer=utm_source%3Dtooyoou%26utm_medium%3Dbanner%26utm_term%3Dfoursquare%26utm_content%3Dfoursquare-tooyoou%26utm_campaign%3Dfoursquare-android

如果碰到上面的鏈接在您的瀏覽器或使QR碼出它並啓動它,它會帶你到應用B在谷歌播放與所需的推薦數據。現在,當應用B安裝在用戶設備上並首次啓動時,應用A預期會收到的廣播是com.android.vending.INSTALL_REFERRER。如果收到廣播並且utm_source是應用程序A,則記錄並處理事務。這是我們所要做的。

這是應用程序A的AndroidManifest.xml代碼片段。

<application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:debuggable="true" > 
     <activity 
      android:name=".LocateMeActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <receiver android:name="com.locateme.android.ReferralReceiver" android:exported="true"> 
     <intent-filter> 
     <action android:name="com.android.vending.INSTALL_REFERRER" /> 
     </intent-filter> 
    </receiver> 
    </application> 

權限添加 -

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 

這裏是廣播接收器類ReferralReceiver.java是應該處理廣播。

import java.io.UnsupportedEncodingException; 
import java.net.URLDecoder; 
import java.util.HashMap; 
import java.util.Map; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 

public class ReferralReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     // Workaround for Android security issue: http://code.google.com/p/android/issues/detail?id=16006 
     try 
     { 
      final Bundle extras = intent.getExtras(); 
      if (extras != null) { 
       extras.containsKey(null); 
      } 
     } 
     catch (final Exception e) { 
      return; 
     } 

     Map<String, String> referralParams = new HashMap<String, String>(); 

     // Return if this is not the right intent. 
     if (! intent.getAction().equals("com.android.vending.INSTALL_REFERRER")) { //$NON-NLS-1$ 
      return; 
     } 

     String referrer = intent.getStringExtra("referrer"); //$NON-NLS-1$ 
     if(referrer == null || referrer.length() == 0) { 
      return; 
     } 

     try 
     { // Remove any url encoding 
      referrer = URLDecoder.decode(referrer, "x-www-form-urlencoded"); //$NON-NLS-1$ 
     } 
     catch (UnsupportedEncodingException e) { return; } 

     // Parse the query string, extracting the relevant data 
     String[] params = referrer.split("&"); // $NON-NLS-1$ 
     for (String param : params) 
     { 
      String[] pair = param.split("="); // $NON-NLS-1$ 
      referralParams.put(pair[0], pair[1]); 
     } 

     ReferralReceiver.storeReferralParams(context, referralParams); 
    } 

    private final static String[] EXPECTED_PARAMETERS = { 
     "utm_source", 
     "utm_medium", 
     "utm_term", 
     "utm_content", 
     "utm_campaign" 
    }; 

    private final static String PREFS_FILE_NAME = "ReferralParamsFile"; 

    public static void storeReferralParams(Context context, Map<String, String> params) 
    { 
     SharedPreferences storage = context.getSharedPreferences(ReferralReceiver.PREFS_FILE_NAME, Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = storage.edit(); 

     for(String key : ReferralReceiver.EXPECTED_PARAMETERS) 
     { 
      String value = params.get(key); 
      if(value != null) 
      { 
       editor.putString(key, value); 
      } 
     } 

     editor.commit(); 
    } 


    public static Map<String, String> retrieveReferralParams(Context context) 
    { 
     HashMap<String, String> params = new HashMap<String, String>(); 
     SharedPreferences storage = context.getSharedPreferences(ReferralReceiver.PREFS_FILE_NAME, Context.MODE_PRIVATE); 

     for(String key : ReferralReceiver.EXPECTED_PARAMETERS) 
     { 
      String value = storage.getString(key, null); 
      if(value != null) 
      { 
       params.put(key, value); 
      } 
     } 
     return params; 
    } 
} 

調試器是在Android OS 2.3.4

通過簡單的TextView和按鈕在App的主要活動我嘗試顯示由接收器捕獲的轉診數據。這裏是電話和顯示 -

referraltext.setText(ReferralReceiver.retrieveReferralParams(this.getApplicationContext()).toString()); 

當我啓動上面顯示應用B的推薦鏈接,去谷歌播放,安裝它,打開它的第一次的logcat不顯示廣播com.android.vending .INSTALL_REFERRER,因此顯示時的引用數據顯示空字符串。

同時,當我在下面使用adb命令時,相同的廣播接收器就像魅力一樣工作並顯示引用數據。

am broadcast -a com.android.vending.INSTALL_REFERRER -n com.locateme.android/.ReferralReceiver --es "referrer" "utm_source=tooyoou&utm_medium=banner&utm_term=foursquare&utm_content=foursquare-tooyoou&utm_campaign=foursquare-android" 

那麼這是否意味着Google Play不會廣播推薦人數據和預期的意圖?

或者這是否意味着它僅針對正在安裝的應用程序B廣播意圖?

或者我做錯了什麼?

如果沒有應用程序B必須在我們的應用程序中插入我們的跟蹤SDK或代碼,我們才能做到這一點。

非常感謝您的幫助。

附加信息 - 我們沒有使用谷歌Analytics(分析)SDK,所以我們正在使用我們的自定義廣播接收器,而不是谷歌的BR

上面的代碼工作就像一個魅力。我在下面的Lucas的建議中標記了正確的答案,並將x-www-form-urlencoded替換爲UTF-8。爲什麼我一開始並沒有這樣做呢?是因爲一家名爲Localytics的移動分析公司發佈了這裏 - http://www.localytics.com/docs/android-market-campaign-analytics/他們的代碼有同樣的問題。所以基本上我現在所擁有的是,我在Google Play中發佈的Android應用程序中的上述代碼片段,然後從運行ICS的Android設備上從Google Play下載應用程序,將其打開並單擊Retrieve Referral並運行。免費試用,這裏是鏈接 - https://play.google.com/store/apps/details?id=com.locateme.android&referrer=utm_source%3Dtooyoou%26utm_medium%3Dbanner%26utm_term%3Dappdownload%26utm_content%3Dimage%26utm_campaign%3Dtooyooupromo

,我要重申,還有很重要的一點是,如果你是遠程設備上使用安裝應用程式的谷歌遊戲活動轉診追蹤這種方式行不通谷歌從網絡上播放。我已經測試過它,它是Google的一個開放缺陷。

+0

嗨Aakash,請問我是否知道你使用任何第三方SDK進行這個跟蹤過程,請儘快告訴我 – Aerrow

+0

其實你不需要。您只需編寫自己的接收器即可捕捉Google Play INSTALL REFERRER廣播並根據需要進行處理。 – Aakash

+0

在我的情況下,我需要使用上述場景。你可以plz指導我實現這個功能。 – Aerrow

回答

7

上面的源代碼是不正確的。

referrer = URLDecoder.decode(referrer, "x-www-form-urlencoded"); 

應該

referrer = URLDecoder.decode(referrer, "UTF-8"); 

的Android文檔並不清楚這一點,但如果你使用的X WWW的形式,進行了urlencoded它會拋出一個不支持的編碼例外。 ...

+0

非常感謝。查看問題中的更新 – Aakash

0

您還可以使用第三方跟蹤,如來自Tunes的移動應用程序跟蹤。這將有助於Android A應用程序在安裝Android B時獲取回傳。 MAT,Appsflyer等第三方工具是用於跟蹤安裝的最常用工具之一。

相關問題