menu
Is this helpful?

# Android Push Integration Document

# I. FCM push

# 1.1 Report "Push ID"

  • Track the FCM Token after calling TA login or switching accounts.
//initialize TA SDK
ThinkingAnalyticsSDK instance = ThinkingAnalyticsSDK.sharedInstance(this, APPID, SERVER_URL);
instance.login("user_id");
FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();
          JSONObject properties = new JSONObject();
          properties.put("fcm_token",token);
          instance.user_set(properties);
        }
 });
  • When FCM Token changes, update user properties:
@Override
public void onNewToken(@NonNull String token) {
    JSONObject properties = new JSONObject();
    properties.put("fcm_token",token);
    instance.user_set(properties);
}

# 1.2. Acquire push click events

When tapping the notification, the user can track the push click events and get the push parameters in onCreate or onNewIntent.

public class PushOpenClickActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handlePushOpen();
    }
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        handlePushOpen();
    }

    private void handlePushOpen() {
        try {
            Intent intent = getIntent();
            if (intent == null) {
                return;
            }
            Bundle bundle = intent.getExtras();
            if (bundle == null) {
                return;
            }
            String teExtras = bundle.getString("te_extras");
            TAPushUtil.trackAppOpenNotification(teExtras);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

# 1.3. Handle push messages

public class PushOpenClickActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handlePushOpen();
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        handlePushOpen();
    }

    private void handlePushOpen() {
        try {
            Intent intent = getIntent();
            if (intent == null) {
                return;
            }
            Bundle bundle = intent.getExtras();
            if (bundle == null) {
                return;
            }
            String teExtras = bundle.getString("te_extras");
            TAPushUtil.handleThinkingPushAction(teExtras);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

# II. JPush

# 2.1 Report "Push ID"

  • Track the Registration ID of JPush after calling TA login or switching accounts.
//call after logging in or switching accounts
instance.login("user_id");

JSONObject properties = new JSONObject();
properties.put("jiguang_id",JPushInterface.getRegistrationID(context));
//instance is TA instance
instance.user_set(properties);
  • Track the Registration ID of URORA in the onRegister interface provided by URORA.
public class PushMessageReceiver extends JPushMessageReceiver {
    @Override
    public void onRegister(Context context, String registrationId) {
        JSONObject properties = new JSONObject();
        properties.put("jiguang_id",registrationId);
        //instance is TA instance
        instance.user_set(properties);
    }
}

# 2.2. Acquire push click events

Non-vendor channels can send push click events in the onNotifyMessageOpened interface.

public class PushMessageReceiver extends JPushMessageReceiver {
    
    @Override
    public void onNotifyMessageOpened(Context context, NotificationMessage message) {
        // send notification click events in notification click callback
        String te_extras = TAPushUtil.getPushExtras(message.notificationExtra);
        TAPushUtil.trackAppOpenNotification(te_extras);
    }
    
}

If a vendor channel is used, you need to get the intent in the onCreate and onNewIntent of the vendor channel Activity, parse out the corresponding parameters, and then send the push click event.

public class PushOpenClickActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handlePushOpen();
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        handlePushOpen();
    }

    private void handlePushOpen() {
        try {
            Intent intent = getIntent();
            if (intent == null) {
                return;
            }
            String pushData = null;
            // message data from Huawei channel
            if (getIntent().getData() != null) {
                pushData = getIntent().getData().toString();
            }
            // message data from Xiaomi, vivo, OPPO and FCM channels (Meizu will call back onNotifyMessageOpened)
            if (TextUtils.isEmpty(pushData) && getIntent().getExtras() != null) {
                pushData = getIntent().getExtras().getString("JMessageExtra");
            }
            if (TextUtils.isEmpty(pushData)) {
                return;
            }
            JSONObject jsonObject = new JSONObject(pushData);
            // additional field for push messages
            String extras = jsonObject.optString("n_extras");
            String te_extras = TAPushUtil.getPushExtras(extras);
            TAPushUtil.trackAppOpenNotification(te_extras);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

# 2.3. Handle push messages

Non-vendor channels can handle push messages in the onNotifyMessageOpened.

public class PushMessageReceiver extends JPushMessageReceiver {
    
    @Override
    public void onNotifyMessageOpened(Context context, NotificationMessage message) {
        //send notification click events in notification click callback
        String te_extras = TAPushUtil.getPushExtras(message.notificationExtra);
        TAPushUtil.handleThinkingPushAction(te_extras);
    }
    
}

If a vendor channel is used, you need to get the intent in the onCreate and onNewIntent of the vendor channel Activity, parse out the corresponding parameters, and then handle the push messages.

public class PushOpenClickActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handlePushOpen();
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        handlePushOpen();
    }

    private void handlePushOpen() {
        try {
            Intent intent = getIntent();
            if (intent == null) {
                return;
            }
            String pushData = null;
            // message data from Huawei channel
            if (getIntent().getData() != null) {
                pushData = getIntent().getData().toString();
            }
            // message data from Xiaomi, vivo, OPPO and FCM channels (Meizu will call back onNotifyMessageOpened)
            if (TextUtils.isEmpty(pushData) && getIntent().getExtras() != null) {
                pushData = getIntent().getExtras().getString("JMessageExtra");
            }
            if (TextUtils.isEmpty(pushData)) {
                return;
            }
            JSONObject jsonObject = new JSONObject(pushData);
            // additional field for push messages
            String extras = jsonObject.optString("n_extras");
            String te_extras = TAPushUtil.getPushExtras(extras);
            TAPushUtil.handleThinkingPushAction(te_extras);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

#

# Appendix

TAPushUtil class

public class TAPushUtil {

    public static void trackAppOpenNotification(String extras) {
        try {
            if (TextUtils.isEmpty(extras)) {
                return;
            }
            JSONObject jsonObject = new JSONObject(extras);
            JSONObject properties = new JSONObject();
            properties.put("#ops_receipt_properties", jsonObject.optJSONObject("#ops_receipt_properties"));
            ThinkingAnalyticsSDK instance = ThinkingAnalyticsSDK.sharedInstance(null, "appId", "serverUrl");
            instance.track("ops_push_click", properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String getPushExtras(Object notificationExtras) {
        String teExtras = "";
        try {
            if (notificationExtras != null) {
                if (notificationExtras instanceof String) {
                    teExtras = new JSONObject((String) notificationExtras).optString("te_extras");
                } else if (notificationExtras instanceof Map) {
                    teExtras = new JSONObject((Map) notificationExtras).optString("te_extras");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return teExtras;
    }

    public static void handleThinkingPushAction(String extras) {
        try {
            if (TextUtils.isEmpty(extras)) {
                return;
            }
            JSONObject jsonObject = new JSONObject(extras);
            String type = jsonObject.optString("ops_loading_type");
            if ("OPEN_APP".equals(type)) {
                // TODO handle open App message, --> please start App
            } else if ("OPEN_URL".equals(type)) {
                String url = jsonObject.optString("ops_url");
                if (!TextUtils.isEmpty(url)) {
                    // TODO handle open URL message, --> please handle URL
                }
            } else if ("CUSTOMIZED".equals(type)) {
                String custom = jsonObject.optString("ops_customized");
                if (!TextUtils.isEmpty(custom)) {
                    // TODO handle custom message, --> please handle custom message
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}