2012-06-11 2 views
12

사용자 기기에 Android 앱 A가 설치되어 있고 다른 Android 개발자가 앱을 게시 할 수 있도록 내 앱이있는 AppWidget이 있다고 가정 해 봅니다. 설치 당 비용 기반 프로모션 광고 따라서 App A의 추천을 통해 App B가 사용자 기기에 설치되는지 여부를 추적해야합니다.Android 앱 A가 Android 앱 B 설치용 Google Play 추천 데이터를 추적하려고합니다.

Android 앱 B의 광고가 Android App A의 위젯에서 실행 중이며 Google에서 앱 B의 사용자에게 App B의 사용자를 Google Play로 리디렉션하는 링크가 모든 리퍼러 데이터와 함께 있다고 가정합시다. 브라우저에서 위의 링크를 누르거나 구글 플레이에 앱 B로 이동합니다 그것에서 QR 코드를 만들고 그것을 실행하는 경우

- (

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-androidhere를 권장) URL은 다음과 같습니다 필요한 추천 데이터로 이제 App B가 사용자의 장치에 설치되고 해당 App A가 수신 할 것으로 예상되는 Broadcast가 처음 실행될 때 com.android.vending.INSTALL_REFERRER입니다. 브로드 캐스트가 수신되고 utm_source가 App A 인 경우 트랜잭션을 기록하고 처리하십시오. 이것이 우리가하고자하는 모든 것입니다.

다음은 App 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; 
    } 
} 

디버깅 장치 I가 수신기에 의해 포착 된 참조 데이터를 표시하려고 앱의 주요 활동에 간단한 텍스트 뷰 및 버튼을 통해 안드로이드 OS 2.3.4

에있다. com.android.vending 방송을 표시하지 않습니다 내가 응용 프로그램 B의 추천 링크는 위와 같이 실행하면

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

것은, Google Play로 이동을 설치하고 처음으로 로그 캣 위해 열 - 다음은 전화 및 디스플레이입니다 .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" 

은 그래서 구글 플레이는 리퍼러 데이터와 전혀 예상 의도를 브로드 캐스트하지 않는 의미합니까?

또는 설치중인 App B에 대해서만 인 텐트를 브로드 캐스트한다는 의미입니까?

아니면 내가 잘못하고있는 것입니까?

App B가 추적 SDK 또는 코드를 앱에 삽입하면 우리에게 광고 할 필요없이이를 달성 할 수 있습니까?

도움을 주셔서 미리 감사드립니다.

정보 추가 - 우리는 그래서 우리는 우리의 정의 방송 수신기가 아닌 구글의 BR

위의 코드는 매력처럼 작동을 사용하는 Google 웹 로그 분석 SDK 사용하고 있지 않습니다. 방금 루카스의 조언을 따라 답을 정하고 x-www-form-urlencoded를 UTF-8로 대체했습니다. 내가 처음에이 작업을 수행하지 않은 이유 때문에 Localytics라는 모바일 분석 회사가 여기에 게시 것입니다 - http://www.localytics.com/docs/android-market-campaign-analytics/ 그들의 코드가 같은 문제가 있습니다. 그래서 기본적으로 내가 지금 무엇을 나는이 Google Play에 게시하고, 구글의 앱이 ICS를 실행하는 Android 기기에서 재생 다운로드 안드로이드 App에서 위의 코드 조각을 열고에 추천 검색 클릭 된하고 일이다. 무료로 사용해보십시오, 여기 링크입니다 - 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는 PLZ 나에게 빨리 – 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"); 

안드로이드 문서는 이것에 대해 명확하지 않다해야하지만, 당신은 x-www-form-urlencoded를 사용하는 경우는 지원되지 않는 인코딩 예외가 발생합니다. ...

+0

정말 고마워. 질문에서 업데이트를 확인하십시오. – Aakash

0

또한 곡에서 모바일 앱 추적과 같은 타사 추적을 사용할 수 있습니다. Android B를 설치할 때마다 Android A 앱이 다시 게시되도록 할 수 있습니다. MAT와 같은 타사 도구 인 Appsflyer는 설치를 추적하는 데 사용되는 가장 일반적인 도구 중 하나입니다. 난 당신이 추적 과정에 대한 제 3 자 SDK를 사용 했 알 수