Android SDK 集成指南

一、下载并导入 SDK

下载中心下载 Android 最新版本 SDK 从下载的文件中,将 aar 文件拷贝到项目的libs文件夹中,并使用 gradle 导入

implementation files('libs/XInstall.aar')

Android SDK导入常见问题

二、初始化

在AndroidManifest.xml中添加权限声明

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

在AndroidManifest.xml的application标签内设置AppKey

<meta-data
    android:name="com.xinstall.APP_KEY"
    android:value="XINSTALL_APPKEY" />

备注: 将XINSTALL_APPKEY替换成 XInstall 为应用分配的appkey

App 启动时,调用 XInstall.init(context)方法完成 sdk 初始化

示例代码

在自定义 Application 中初始化

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        if (isMainProcess()) {
        /**
         * 调用初始化时请注意:
         * 1. 首次调用,需要确保客户同意《隐私政策》之后,再次初始化Xinstall SDK
         * 2. 仅在主进程UI线程中调用初始化接口
         */
         XInstall.init(this);
         //启用log
         XInstall.setDebug(true);
        }
    }

    public boolean isMainProcess() {
        int pid = android.os.Process.myPid();
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) {
            if (appProcess.pid == pid) {
                return getApplicationInfo().packageName.equals(appProcess.processName);
            }
        }
        return false;
    }
}

为满足隐私合规要求,开发者可以控制SDK获取Android IDserial Number 粘贴板权限

// androidID/serial Number 配置值即为可以外部获取。如不想SDK 自动获取,也不想传入值 传""即可。建议尽量获取
XInstall.init(this, XINConfiguration.Builder().androidId("android ID").serial("serial Number").canClip(true));

备注: 当应用存在多个进程时,确保只在主进程进行初始化 在AndroidManifest.xml中的application标签中添加android:name=".MyApplication"指定自定义的Application类,以便程序启动的时候初始化自定义Application类,而不是默认配置的Application类

<application
    android:name=".MyApplication"
    android:allowBackup="false"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    ...
</application>

三、功能集成

1.快速下载

如果只需要快速下载功能,无需其它功能(携带参数安装、渠道统计、一键拉起),完成初始化即可

2.一键拉起

2.1 在AndroidManifest.xml的拉起页面activity标签中添加intent-filter(一般为MainActivity),配置scheme,用于浏览器中拉起

<activity
    android:name=".MainActivity"
    android:launchMode="singleTask">
    <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="XINSTALL_SCHEME"/>
    </intent-filter>
</activity>

如果拉起页面和启动页是同一Activity,则AndroidManifest.xml的配置如下

<activity
    android:name=".MainActivity"
    android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
    <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="XINSTALL_SCHEME"/>
    </intent-filter>
</activity>

备注: 将XINSTALL_SCHEME配置成 XInstall 为应用分配的scheme,在后台Android集成-功能集成文档中查看,格式为xi+appkey

2.2 在拉起页面中如下调用相关代码,获取 web 端传过来的动态参数

您可以在下述两种回调方法中任选一个进行实现,不同的回调方法有不同的逻辑,请选择最符合您实际场景的方法,请勿同时实现两个方法。

方法一:

public static void getWakeUpParam(Activity activity, Intent intent, XWakeUpListener wakeUpListener)
class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取唤醒参数
        XInstall.getWakeUpParam(this,getIntent(), wakeUpAdapter);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        // 此处要调用,否则App在后台运行时,会无法截获
        XInstall.getWakeUpParam(this,intent, wakeUpAdapter);
    }

    XWakeUpAdapter wakeUpAdapter = new XWakeUpAdapter() {
        @Override
        public void onWakeUp(XAppData XAppData) {
            //获取渠道数据
            String channelCode = XAppData.getChannelCode();

            //获取数据
            Map<String, String> data = XAppData.getExtraData();
            //通过链接后面携带的参数或者通过webSdk初始化传入的data值。
            String uo = data.get("uo");
            //webSdk初始,在buttonId里面定义的按钮点击携带数据
            String co = data.get("co");

            //获取时间戳
            String timeSpan = XAppData.getTimeSpan();

        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        wakeUpAdapter = null;
    }
}

方法二:

// 该方法是getWakeUpParam的补充,调用该方法,一定会回调wakeUpListener里的回调方法,并把相关情况返回。
public static void getWakeUpParamEvenErrorAlsoCallBack(Activity activity, Intent intent, XWakeUpListener wakeUpListener)
class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取唤醒参数
        XInstall.getWakeUpParamEvenErrorAlsoCallBack(this,getIntent(), wakeUpAdapter);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        // 此处要调用,否则App在后台运行时,会无法截获
        XInstall.getWakeUpParamEvenErrorAlsoCallBack(this,intent, wakeUpAdapter);
    }


    XWakeUpAdapter wakeUpAdapter = new XWakeUpAdapter() {
        @Override
        public void onWakeUpFinish(XAppData XAppData,XAppError xAppError) {
          if (error == null) {
            if (data != null) {
                //获取渠道数据
                String channelCode = XAppData.getChannelCode();

                //获取数据
                Map<String, String> data = XAppData.getExtraData();
                //通过链接后面携带的参数或者通过webSdk初始化传入的data值。
                    String uo = data.get("uo");
                //webSdk初始,在buttonId里面定义的按钮点击携带数据
                String co = data.get("co");

                //获取时间戳
                String timeSpan = XAppData.getTimeSpan();
            }
          } else {
            String errorCode = error.errorCode;
            String errorMsg = error.errorMsg
          }
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        wakeUpAdapter = null;
    }
}

2.3 如果您的应用上架了应用宝,可能需要进行一些额外的配置。配置方法如下:

  • 如果应用的启动页和拉起页面不是同一个 Activity,那么还需要完成以下两点配置:

    • 在启动页 Activity 的 onCreate onNewIntent 方法中调用 XInstall.saveInfoAndByLauncherActivityAndIntent() 方法:

      // WelcomeActivity 是启动页
      class WelcomeActivity extends AppCompatActivity {
      
          @Override
          protected void onCreate(@Nullable Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
      
              // 在这里调用 XInstall.saveInfoAndByLauncherActivityAndIntent 方法
              XInstall.saveInfoAndByLauncherActivityAndIntent(this, getIntent());;
          }
      
          @Override
          public void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            XInstall.saveInfoAndByLauncherActivityAndIntent(this, intent);
          }
      }
      
    • 在 AndroidManifest.xml 文件中,将启动页 Activity 的 launchMode 配置为 singleTask 类型:

      <activity
          android:name=".WelcomeActivity"
          android:launchMode="singleTask">
          <intent-filter>
              <action android:name="android.intent.action.MAIN"/>
              <category android:name="android.intent.category.LAUNCHER"/>
          </intent-filter>
      </activity>
      

3.携带参数安装

在 APP 需要安装参数时(由 web 网页中传递过来的,如邀请码、游戏房间号等动态参数),调用XInstall.getInstallParam方法,在回调中获取参数(可重复获取)

XInstall.getInstallParam(new XInstallAdapter() {
    @Override
      public void onInstall(XAppData XAppData) {
            //获取渠道数据
        String channelCode = XAppData.getChannelCode();

        //获取数据
        Map<String, String> data = XAppData.getExtraData();
        //通过链接后面携带的参数或者通过webSdk初始化传入的data值。
        String uo = data.get("uo");
        //webSdk初始,在buttonId里面定义的按钮点击携带数据
        String co = data.get("co");

        //获取时间戳
        String timeSpan = XAppData.getTimeSpan();
        // 是否为第一次获取到安装参数
        boolean firstFetch = XAppData.isFirstFetch();
    }
});

您可以在 Xinstall 管理后台对应的 App 内,看到所有的传递参数以及参数出现的次数,方便你们做运营统计分析,如通过该报表知道哪些页面或代理带来了最多客户,客户最感兴趣的 App 页面是什么等。具体参数名和值,运营人员可以和技术协商定义,或联系 Xinstall 客服咨询。具体效果如下图:

传参报表

4.高级数据统计

SDK 会自动完成访问量、点击量、安装量、活跃量、留存率等统计工作。

4.1 注册量统计

如需统计每个渠道的注册量(对评估渠道质量很重要),可根据自身的业务规则,在确保用户完成 app 注册的情况下调用以下接口:

//用户注册成功后调用
XInstall.reportRegister();

4.2 事件统计

事件统计可以自定义埋点数据,通过埋点,可以了解到用户使用您应用的后续行为,用于评估渠道效果与价值。如:加购数、下单人数等。使用事件统计,需要先在【事件统计】页面内添加事件统计。只针对iOS和Android客户端。

调用接口时,请使用后台创建的 “事件统计ID” 作为 eventID

// 入参:事件统计ID,事件值
XInstall.reportEvent("eventID",1);

您可以设置不同事件来满足不同的业务场景,如下图所示,您可以设置充值事件,进行上报。就可以统计到总的充值设备数为32个,累积充值金额为364元

4.3 事件明细统计

除了旧有事件业务,我们还开发了事件明细统计,用来统计各个事件具体发生情况

在使用之前要现在后台管理系统中打开该事件明细统计功能,具体如下:

在开启权限之后,我们直接使用Xinstall SDK 的public static void reportEventWhenOpenDetailInfo(String var0, int var1, String var2)方法上传单个事件的第二个详细值

// 123 为事件值
XInstall.reportEventWhenOpenDetailInfo("事件ID",123,"事件详情值(如用户名)");

最终在事件列表中可以点击查看查阅具体详情的内容

5.场景定制统计

5.1 分享统计

场景业务介绍,可到分享数据统计页面查看

分享统计主要用来统计分享业务相关的数据,例如分享次数、分享查看人数、分享新增用户等。在用户分享操作触发后(注:此处为分享事件触发,非分享完成或成功),可调用如下方法上报一次分享数据:

具体调用如下

// 入参:填写分享人或UID
XInstall.reportShareByXinShareId("填写分享人或UID");

注:分享人或UID 可由您自行定义,只需要用以区分用户即可

您可在 Xinstall 管理后台 对应 App 中查看详细分享数据报表,表中的「分享人/UID」即为调用方法时携带的参数,其余字段含义可将鼠标移到字段右边的小问号上进行查看:

分享报表

四、导出apk包并上传

  • 代码集成完毕后,需要导出安装包上传 XInstall 后台,XInstall 会自动完成所有的应用配置工作。
  • 上传完成后即可开始在线模拟测试,体验完整的App安装/拉起流程;待测试无误后,再完善下载配置信息。

下面是apk包的上传界面(后台截图):

results matching ""

    No results matching ""