Skip to main content

Android SDK Implementation Examples

This page provides practical examples of how to implement the Zeotap Android SDK in common app scenarios.

Complete App Integration Example

Application Setup

import android.app.Application;
import com.zeotap.collect.Collect;
import com.zeotap.collect.CollectOptions;

public class MainApplication extends Application {

@Override
public void onCreate() {
super.onCreate();

// Configure and initialize Zeotap Collect SDK
setupZeotapSDK();
}

private void setupZeotapSDK() {
CollectOptions options = CollectOptions.builder(this)
.credential(getWriteKeyForEnvironment())
.enableLogging(BuildConfig.DEBUG)
.build();

Collect.init(options);

// Set up initial user properties
setInitialUserProperties();
}

private String getWriteKeyForEnvironment() {
if (BuildConfig.DEBUG) {
return "zt_android_dev_1234567890abcdef";
}
return "zt_android_prod_1234567890abcdef";
}

private void setInitialUserProperties() {
Map<String, Object> userProperties = new HashMap<>();
userProperties.put("appVersion", BuildConfig.VERSION_NAME);
userProperties.put("deviceModel", Build.MODEL);
userProperties.put("osVersion", Build.VERSION.RELEASE);

Collect.getInstance().setUserProperties(userProperties);
}
}

E-commerce App Example

Product Catalog Integration

import com.zeotap.collect.Collect;

public class ProductListActivity extends AppCompatActivity {

private List<Product> products;
private String category;
private long startTime;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Track screen view
Map<String, Object> eventProps = new HashMap<>();
eventProps.put("category", category);
eventProps.put("productCount", products.size());

Collect.getInstance().setEventProperties("Product List Viewed", eventProps);
}

@Override
protected void onResume() {
super.onResume();
startTime = System.currentTimeMillis();
}

@Override
protected void onPause() {
super.onPause();
long timeSpent = System.currentTimeMillis() - startTime;

Map<String, Object> eventProps = new HashMap<>();
eventProps.put("category", category);
eventProps.put("timeSpentMs", timeSpent);

Collect.getInstance().setEventProperties("Time Spent on Category", eventProps);
}
}

public class ProductDetailActivity extends AppCompatActivity {

private Product product;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Track product view
Map<String, Object> eventProps = new HashMap<>();
eventProps.put("productId", product.getId());
eventProps.put("productName", product.getName());
eventProps.put("category", product.getCategory());
eventProps.put("price", product.getPrice());
eventProps.put("currency", "USD");
eventProps.put("brand", product.getBrand());
eventProps.put("inStock", product.isInStock());

Collect.getInstance().setEventProperties("Product Viewed", eventProps);
}

private void onAddToCartClicked() {
CartManager.getInstance().addProduct(product);

Map<String, Object> eventProps = new HashMap<>();
eventProps.put("productId", product.getId());
eventProps.put("productName", product.getName());
eventProps.put("price", product.getPrice());
eventProps.put("currency", "USD");
eventProps.put("cartTotal", CartManager.getInstance().getTotal());
eventProps.put("cartItemCount", CartManager.getInstance().getItemCount());

Collect.getInstance().setEventProperties("Product Added to Cart", eventProps);
}
}

Purchase Flow

public class CheckoutActivity extends AppCompatActivity {

private void completePurchase(OrderData orderData) {
try {
PaymentResult result = processPayment(orderData);

// Track successful purchase
Map<String, Object> eventProps = new HashMap<>();
eventProps.put("orderId", result.getTransactionId());
eventProps.put("totalAmount", orderData.getTotal());
eventProps.put("currency", orderData.getCurrency());
eventProps.put("itemCount", orderData.getItems().size());
eventProps.put("paymentMethod", orderData.getPaymentMethod());

Collect.getInstance().setEventProperties("Purchase Completed", eventProps);

} catch (PaymentException e) {
// Track failed purchase
Map<String, Object> eventProps = new HashMap<>();
eventProps.put("errorCode", e.getCode());
eventProps.put("errorMessage", e.getMessage());
eventProps.put("attemptedAmount", orderData.getTotal());

Collect.getInstance().setEventProperties("Purchase Failed", eventProps);
}
}
}

User Authentication Example

import com.zeotap.collect.Collect;

public class AuthenticationManager {

private static AuthenticationManager instance;

public static AuthenticationManager getInstance() {
if (instance == null) {
instance = new AuthenticationManager();
}
return instance;
}

public void loginUser(String email, String password, AuthCallback callback) {
apiLogin(email, password, (result) -> {
if (result.isSuccess()) {
handleSuccessfulLogin(result.getUser());
callback.onSuccess(result.getUser());
} else {
handleFailedLogin(email, result.getError());
callback.onFailure(result.getError());
}
});
}

private void handleSuccessfulLogin(User user) {
// Set user identities
Map<String, String> identities = new HashMap<>();
identities.put("email", user.getEmail());
identities.put("userId", user.getId());
if (user.getPhoneNumber() != null) {
identities.put("cellno", user.getPhoneNumber());
}

Collect.getInstance().setUserIdentities(identities);

// Set user properties
Map<String, Object> userProperties = new HashMap<>();
userProperties.put("accountType", user.getAccountType());
userProperties.put("signupDate", user.getSignupDate());
userProperties.put("isVerified", user.isVerified());
userProperties.put("subscription", user.getSubscription());

Collect.getInstance().setUserProperties(userProperties);

// Track login event
Map<String, Object> eventProps = new HashMap<>();
eventProps.put("method", "email_password");
eventProps.put("isFirstTime", user.isFirstTimeLogin());

Collect.getInstance().setEventProperties("User Logged In", eventProps);
}

private void handleFailedLogin(String email, Error error) {
Map<String, Object> eventProps = new HashMap<>();
eventProps.put("method", "email_password");
eventProps.put("error", error.getMessage());
eventProps.put("email", email.isEmpty() ? "empty" : "provided");

Collect.getInstance().setEventProperties("Login Failed", eventProps);
}

public void logoutUser() {
// Track logout
Collect.getInstance().setEventProperties("User Logged Out");

// Clear user identities
Collect.getInstance().unSetUserIdentities();
}
}
import com.zeotap.collect.Collect;

public class ConsentDialogFragment extends DialogFragment {

private boolean analyticsConsent = false;
private boolean marketingConsent = false;
private boolean personalizationConsent = false;

private void handleAcceptAll() {
Map<String, Object> consent = new HashMap<>();
consent.put("track", true);
consent.put("identify", true);
consent.put("analyticsConsent", true);
consent.put("marketingConsent", true);
consent.put("personalizationConsent", true);

Collect.getInstance().setConsent(consent);
dismiss();
}

private void handleRejectAll() {
Map<String, Object> consent = new HashMap<>();
consent.put("track", false);
consent.put("identify", false);
consent.put("analyticsConsent", false);
consent.put("marketingConsent", false);
consent.put("personalizationConsent", false);

Collect.getInstance().setConsent(consent);
dismiss();
}

private void handleCustomConsent() {
Map<String, Object> consent = new HashMap<>();
consent.put("track", analyticsConsent);
consent.put("identify", analyticsConsent);
consent.put("analyticsConsent", analyticsConsent);
consent.put("marketingConsent", marketingConsent);
consent.put("personalizationConsent", personalizationConsent);

Collect.getInstance().setConsent(consent);
dismiss();
}
}

Activity Lifecycle Tracking

import com.zeotap.collect.Collect;

public class BaseActivity extends AppCompatActivity {

@Override
protected void onResume() {
super.onResume();

// Track screen view
Map<String, Object> pageProperties = new HashMap<>();
pageProperties.put("screen_name", getClass().getSimpleName());

Collect.getInstance().setPageProperties(pageProperties);

// Track navigation event
Map<String, Object> eventProps = new HashMap<>();
eventProps.put("screen_name", getClass().getSimpleName());
eventProps.put("navigation_method", "app_navigation");

Collect.getInstance().setEventProperties("screen_view", eventProps);
}
}

Best Practices Summary

  1. Initialize Early: Set up the SDK in your Application's onCreate() method
  2. Page Context: Always set page properties before tracking events
  3. Error Handling: Implement callbacks for critical events
  4. Consent First: Handle consent before any tracking
  5. Development vs Production: Use different configs for different environments
  6. Consistent Naming: Use same event names across platforms for cross-device tracking

For more detailed API documentation, see our API Reference section.