获取GooglePlay下载来源广告数据,就是你的应用通过广告推广到各个渠道也就是代投,当用户点击这条广告之时,会跳转到Google Play的下载页面,Google Play会记录你是在哪个推广渠道跳转到Google Play的,当用户下载安装之后我们可以用谷歌提供的api来获取信息,这些数据让你们的市场部或者运营部去分析哪个渠道带来的用户量更多或者那个渠道的转化率高。在Google Play8.3.73之前通过广播来获取来源信息,在Google Play8.3.73版本和之后的版本通过新版的api与Google Play建立链接之后获取新版的api可以获取到更多的信息(安装时间,和点击时间),所以做了版本的区分
1.添加谷歌api依赖,每个都要用最新的版本不然会出现有些类找不到的问题,可以通过以下链接去查看自己引用的包是否是最新的: https://developers.google.com/android/guides/setup
implementation 'com.google.android.gms:play-services-analytics:16.0.8' implementation 'com.google.firebase:firebase-core:16.0.8' implementation 'com.squareup.okhttp3:okhttp:3.10.0' 2.在Googl play<8.3.73时候通过广播获取来源数据,所以需要在自己的AndroidManifest.xml配置广播,代码如下,一个是谷歌的广播,一个 是我自定义的广播。当应用安装成功并第一次启动的时候谷歌会发送com.android.vending.INSTALL_REFERRER广播到当前应用(此广播不会被其它应用所接收,只会被当前应用所接收)。由于新版的i获取来源信息的api也要保证获取一次,避免数据重复统计,所以我也把新版的接入依赖于这个广播(谷歌推荐监听 Intent.ACTION_PACKAGE_FIRST_LAUNCH这个广播,但是通过很多测试根本收不到这个广播)
<!-- Google Analytics --> <receiver android:name="com.google.android.gms.analytics.CampaignTrackingReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.android.vending.INSTALL_REFERRER" /> </intent-filter> </receiver> <!-- Google Analytics --> <receiver android:name=".InstallReferrerBroadcastReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.android.vending.INSTALL_REFERRER"/> </intent-filter> </receiver> </application>
3.直接对自定义的广播的onReceive里面做我们的数据分版本获取。Googl play的版本是否大于等于8.3.73的问题,后来反编译发现8.3.73的版本versionCode="80837300",所以可以通过获取versionCode,如果versionCode<80837300就用旧版api,不然旧用新版api。
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.os.RemoteException; import android.util.Log; import android.widget.Toast; import com.android.installreferrer.api.InstallReferrerClient; import com.android.installreferrer.api.InstallReferrerStateListener; import com.android.installreferrer.api.ReferrerDetails; import com.facebook.appevents.AppEventsLogger; import com.google.android.gms.analytics.CampaignTrackingReceiver; import com.google.firebase.analytics.FirebaseAnalytics; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class InstallReferrerBroadcastReceiver extends BroadcastReceiver { private InstallReferrerClient mReferrerClient; private Context context; private Intent intent; @Override public void onReceive(Context context, Intent intent) { int appVersionCode = getAppVersionCode(context); this.context = context; this.intent = intent; String mAction = intent.getAction(); Log.e("e","收到广播的回调mAction=" + mAction); if (appVersionCode < 80837300) { Log.e("e","旧版获取渠道来源数据"); getInstallReferrerData(); } else { Log.e("e","新版获取渠道来源数据"); getConnect(); } //Firebase初始化并且埋点,给代投广告后台看的信息 FirebaseAnalytics mFirebaseAnalytics = FirebaseAnalytics.getInstance(context); Bundle bundleEvent = new Bundle(); bundleEvent.putLong("click_time", System.currentTimeMillis()); bundleEvent.putString("key", "value"); mFirebaseAnalytics.logEvent("click_event", bundleEvent); } private void sendData(String data){ String m_szDevIDShort = "35" + //we make this look like a valid IMEI Build.BOARD.length()%10 + Build.BRAND.length()%10 + Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 + Build.DISPLAY.length()%10 + Build.HOST.length()%10 + Build.ID.length()%10 + Build.MANUFACTURER.length()%10 + Build.MODEL.length()%10 + Build.PRODUCT.length()%10 + Build.TAGS.length()%10 + Build.TYPE.length()%10 + Build.USER.length()%10 ; //13 digits Log.e("e","获取数据成功了"); OkHttpClient client = new OkHttpClient(); RequestBody requestBody = new FormBody.Builder() .add("appName", "Tangki kekayaan") .add("flag", m_szDevIDShort) .add("infoString", data) .build(); Request request = new Request.Builder() .url("*****") .post(requestBody) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if(response.isSuccessful()){//回调的方法执行在子线程。 Log.e("e","获取数据成功了"); Log.e("e","response.code()=="+response.code()); Log.e("e","response.body().string()=="+response.body().string()); } } }); } /** * Google Play版本<8.3.73时获取安装来源数据 */ private void getInstallReferrerData() { Bundle extras = intent.getExtras(); String referrer = ""; if (extras != null) { referrer = extras.getString("referrer"); // 格式:utm_source=testSource&utm_medium=testMedium&utm_term=testTerm&utm_content=11 upLoadinstallReferrer(referrer); } new CampaignTrackingReceiver().onReceive(context, intent);//调用谷歌广播的方法 } /** * 获取版本号 * * @return Google Play应用的版本号 */ public static int getAppVersionCode(Context context) { try { PackageManager manager = context.getPackageManager(); PackageInfo info = manager.getPackageInfo("com.android.vending", 0); int version = info.versionCode; return version; } catch (Exception e) { e.printStackTrace(); return -1; } } /** * 与谷歌商店建立连接 */ private void getConnect() { mReferrerClient = InstallReferrerClient.newBuilder(context).build(); mReferrerClient.startConnection(installReferrerStateListener); } private InstallReferrerStateListener installReferrerStateListener = new InstallReferrerStateListener() { @Override public void onInstallReferrerSetupFinished(int responseCode) { switch (responseCode) { case InstallReferrerClient.InstallReferrerResponse.OK: // Connection established // Toast.makeText(context, "与谷歌商店连接成功", Toast.LENGTH_LONG).show(); Log.e("e","与谷歌商店连接成功"); getMessage(); break; case InstallReferrerClient.InstallReferrerResponse.FEATURE_NOT_SUPPORTED: // API not available on the current Play Store app // Toast.makeText(context, "与谷歌商店连接失败", Toast.LENGTH_LONG).show(); Log.e("e","与谷歌商店连接失败败:API not available on the current Play Store app"); break; case InstallReferrerClient.InstallReferrerResponse.SERVICE_UNAVAILABLE: // Connection could not be established Log.e("e","InstallReferrerClient.InstallReferrerResponse.SERVICE_UNAVAILABLE"); // Toast.makeText(context, "与谷歌商店连接失败", Toast.LENGTH_LONG).show(); break; } } @Override public void onInstallReferrerServiceDisconnected() { // Try to restart the connection on the next request to // Google Play by calling the startConnection() method. Log.e("e","onInstallReferrerServiceDisconnected"); Log.e("e","onInstallReferrerServiceDisconnected()"); //重新连接 getConnect(); } }; /** * Google Play版本>=8.3.73时获取安装来源数据 */ private void getMessage() { try { ReferrerDetails response = mReferrerClient.getInstallReferrer(); String installReferrer = response.getInstallReferrer(); long referrerClickTimestampSeconds = response.getReferrerClickTimestampSeconds(); installReferrer = installReferrer + "&" + "referrerClickTimestampSeconds=" + referrerClickTimestampSeconds; long installBeginTimestampSeconds = response.getInstallBeginTimestampSeconds(); installReferrer = installReferrer + "&" + "installBeginTimestampSeconds=" + installBeginTimestampSeconds; upLoadinstallReferrer(installReferrer); } catch (RemoteException e) { e.printStackTrace(); } new CampaignTrackingReceiver().onReceive(context, intent);//调用谷歌广播的方法 } /** * 上传数据到服务器 */ private void upLoadinstallReferrer(String referer) { //facebook 安装完成 logInstallationIsCompleteEvent ("installationIsComplete"); sendData(referer); Toast.makeText(context, "" + referer, Toast.LENGTH_LONG).show(); JSONObject object = getSplitData(referer); } public void logInstallationIsCompleteEvent (String installationIsComplete) { AppEventsLogger logger = AppEventsLogger.newLogger(context); Bundle params = new Bundle(); logger.logEvent("installation is complete", params); } /** * 把格式:utm_source=testSource&utm_medium=testMedium&utm_term=testTerm&utm_content=11 * 这种格式的数据切割成key,value的形式并put进JSONObject对象,用于上传 * @param referer * @return */ private JSONObject getSplitData(String referer) { JSONObject object = new JSONObject(); for (String data : referer.split("&")) { String[] split = data.split("="); for (int i = 0; i < split.length; i++) { try { object.put(split[0], split[1]); } catch (JSONException e) { e.printStackTrace(); } } } return object; } }
4.接下来就是如何测试的问题,由于之前完全没有接触所以在摸索如何测试之时花了许多时间,首先进行本地测试(因为应用发布到GooglePlay是要时间审核的,并且上传的应用不能够打印日志,所以先本地测试,节约时间),所谓的本地测试就是通过adb命令发送一个广播,然后通过日志或者打印看是否能获取到数据,如果有加上统计看是否能统计到来源信息,由于GooglePlay8.3.73版本和之后的版本来源信息不是通过广播传给我们应用而是通过与GooglePlay建立连接之后获取,所以本地测试只能测试GooglePlay8.3.73之前的来源信息获取,测试方法:
4.1通过Android Studio的Terminal窗口下输入adb shell然后点击enter通过给自己的发送广播
am broadcast -a com.android.vending.INSTALL_REFERRER -n 应用包名/包名.自定义的广播名 --es "referrer" "utm_source=testSource&utm_medium=testMedium&utm_term=testTerm&utm_content=11"
注意 当返回的是如果有result=0则表明广播发送成功,如果没有检查一下自己的包名和广播的路径是否正确。发送广播成功就可以验证自己的 代码是否获取来源数据成功了,并且自己debug一下看看走的流程确认一次。
5.当你的应用上传之后,你需要通过谷歌的一个Url构建网址去创建一个模拟广告的的url,
A PK正式上线成功后,通过上面的连接生成网站就可以测试所有流程。