Kullanıcı etkileşimini ölçme

Bu kılavuzda, Chrome özel sekmeleri için etkileşim sinyallerinin nasıl ölçüleceği açıklanmaktadır. Uygulamanız, kullanıcılarına düzenli olarak web içeriği bağlantıları sunuyorsa (ör. bir haber feed'inde) kullanıcıların hangi bağlantıları değerli bulduğunu ve hangilerini bulmadığını bilmek önemli olabilir. Özel Sekmeler'de, gezinme sayısı, kaydırma yönü değişiklikleri ve kaydırma derinliği aracılığıyla oturuma özgü kullanıcı etkileşimini ölçebilirsiniz. Etkileşim sinyallerini çalışırken görmek için GitHub'daki Özel Sekmeler demo uygulamasına göz atın.

Özel Sekme etkileşim sinyalleri demosu.

Özel Sekmeler, kullanıcı etkileşimini ölçmek için iki farklı geri çağırma sağlar:

  • "NAVIGATION_STARTED" veya "NAVIGATION_FINISHED" gibi temel gezinme etkinliklerini izlemek için CustomTabsCallback.
  • Sayfaya özgü kullanıcı etkileşimini (ör. kaydırma yönü veya kaydırma yüzdesi) izlemek için EngagementSignalsCallback.

Her ikisi için de etkin bir CustomTabsServiceConnection gerekir. CustomTabsService'a nasıl bağlanacağınızla ilgili ayrıntılar için önceki CustomTabsService kılavuzuna bakın.

Kullanıcı etkileşimini ölçmek için önce bir CustomTabsCallback ve bir EngagementSignalsCallback örneği oluşturun. CustomTabsCallback, hangi tür bir gezinmenin gerçekleştiğini açıklayan bir navigationEvent sabit değeri alır:

private CustomTabsCallback mCustomTabsCallback = new CustomTabsCallback() {
    @Override
    public void onNavigationEvent(int navigationEvent, @Nullable Bundle extras) {
        String event;
        switch (navigationEvent) {
            case CustomTabsCallback.NAVIGATION_ABORTED:
                event = "NAVIGATION_ABORTED";
                break;
            case CustomTabsCallback.NAVIGATION_FAILED:
                event = "NAVIGATION_FAILED";
                break;
            case CustomTabsCallback.NAVIGATION_FINISHED:
                event = "NAVIGATION_FINISHED";
                break;
            case CustomTabsCallback.NAVIGATION_STARTED:
                event = "NAVIGATION_STARTED";
                break;
            case CustomTabsCallback.TAB_SHOWN:
                event = "TAB_SHOWN";
                break;
            case CustomTabsCallback.TAB_HIDDEN:
                event = "TAB_HIDDEN";
                break;
            default:
                event = String.valueOf(navigationEvent);
        }
        Log.d(TAG, "onNavigationEvent (navigationEvent=" + event + ')');
        mTextNavigation.setText("onNavigationEvent " + event);
    }
};

EngagementSignalsCallback üç farklı geri çağırma işlevini destekler:

onVerticalScrollEvent()
Kullanıcı kaydırma yönünü her değiştirdiğinde çağrılır. isDirectionUp (ilk bağımsız değişken), yönü belirtir.
  1. onGreatestScrollPercentageIncreased: Özel Sekme, kullanıcı sayfanın en altına ulaştığında kaydırma derinliğini% 5 aralıklar halinde% 100'e kadar bildirir. Geri çağırma işlevi yalnızca kullanıcı kaydırmayı durdurduktan sonra çağrılır. Değer, her yeni gezinmeyle% 0'a sıfırlanır.
  2. onSessionEnded: Özel Sekme, etkileşim sinyalleri göndermeyi durdurduğunda (örneğin, kullanıcı Özel Sekme'yi kapattıktan sonra) bu etkinliği tetikler. Kullanıcı sayfayla herhangi bir şekilde etkileşime geçtiyse (kaydırma, düğme tıklama vb.) didUserInteract doğru olur.
private EngagementSignalsCallback mEngagementSignalsCallback = new EngagementSignalsCallback() {
    @Override
    public void onVerticalScrollEvent(boolean isDirectionUp, @NonNull Bundle extras) {
        Log.d(TAG, "onVerticalScrollEvent (isDirectionUp=" + isDirectionUp + ')');
        mTextVerticalScroll.setText("vertical scroll " + (isDirectionUp ? "UP️" : "DOWN"));
    }

    @Override
    public void onGreatestScrollPercentageIncreased(int scrollPercentage, @NonNull Bundle extras) {
        Log.d(TAG, "scroll percentage: " + scrollPercentage + "%");
        mTextGreatestPercentage.setText("scroll percentage: " + scrollPercentage + "%");
    }

    @Override
    public void onSessionEnded(boolean didUserInteract, @NonNull Bundle extras) {
        Log.d(TAG, "onSessionEnded (didUserInteract=" + didUserInteract + ')');
        mTextSessionEnd.setText(didUserInteract ? "session ended with user interaction" : "session ended without user interaction");
    }
};

Hem CustomTabsCallback hem de EngagementSignalsCallback için etkin bir Özel Sekme hizmet bağlantısı gerekir. Hizmet bağlandıktan sonra CustomTabsClient.newSession() çağrısını yaparak ve CustomTabsCallback değerini ileterek yeni bir CustomTabsSession oluşturabilirsiniz.

Ardından, etkileşim sinyallerinin geçerli tarayıcı tarafından desteklenip desteklenmediğini kontrol etmek için isEngagementSignalsApiAvailable() işlevini çağırmanız gerekir. Destekleniyorsa EngagementSignalsCallback'nizi CustomTabsSession.setEngagementSignalsCallback() üzerinden kaydedebilirsiniz.

private CustomTabsClient mCustomTabsClient;
private CustomTabsSession mCustomTabsSession;

private final CustomTabsServiceConnection mServiceConnectionCallback = new CustomTabsServiceConnection() {

    @Override
    public void onCustomTabsServiceConnected(@NonNull ComponentName name, @NonNull CustomTabsClient client) {
        mCustomTabsClient = client;
        mCustomTabsSession = mCustomTabsClient.newSession(mCustomTabsCallback);
        try {
            boolean engagementSignalsApiAvailable = mCustomTabsSession.isEngagementSignalsApiAvailable(Bundle.EMPTY);
            if (!engagementSignalsApiAvailable) {
                Log.d(TAG, "CustomTab Engagement signals not available, make sure to use the " +
                        "latest Chrome version and enable via chrome://flags/#cct-real-time-engagement-signals");
                return;
            }
            mCustomTabsSession.setEngagementSignalsCallback(mEngagementSignalsCallback, Bundle.EMPTY);
        } catch (RemoteException e) {
            Log.w(TAG, "The Service died while responding to the request.", e);
        } catch (UnsupportedOperationException e) {
            Log.w(TAG, "Engagement Signals API isn't supported by the browser.", e);
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        mCustomTabsClient = null;
        mConnection = null;
        mCustomTabsSession = null;
    }
};

Tek yapmanız gereken CustomTabsService öğesini bağlamaktır:

@Override
protected void onStart() {
    super.onStart();
    bindCustomTabsService();
}

private void bindCustomTabsService() {
    String packageName = CustomTabsHelper.getPackageNameToUse(this);
    if (packageName == null) return;
    CustomTabsClient.bindCustomTabsService(this, packageName, mConnection);
}