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ı gösteriyorsa (ör. haber feed'inde) kullanıcıların hangi bağlantıları değerli bulup hangilerini değerli bulmadığını bilmek önemli olabilir. Özel Sekmelerde, 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 uygulamalı olarak görmek için GitHub'daki Özel Sekmeler demo uygulamasına göz atın.

Özel sekme etkileşim sinyalleri demosu.
ziyaret edin.
'nı inceleyin.

Ö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.
  • Kaydırma yönü veya kaydırma yüzdesi gibi sayfaya özgü kullanıcı etkileşimlerini izlemek için EngagementSignalsCallback.

Her ikisi için de etkin bir CustomTabsServiceConnection gereklidir. CustomTabsService cihazına 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, ne tür gezinmenin gerçekleştiğini açıklayan bir navigationEvent sabiti 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ğırmayı destekler:

onVerticalScrollEvent()
Kullanıcı kaydırma yönünü her değiştirdiğinde çağrılır. Burada isDirectionUp (ilk bağımsız değişken) yönü belirtir.
  1. onGreatestScrollPercentageIncreased: Kullanıcı, sayfanın en altına ulaştığında Özel Sekme, %100'e kadar olan aralıklarla% 5'lik aralıklarda kaydırma derinliğini gösterir. Geri çağırma yalnızca kullanıcı kaydırmayı durdurduğunda çağrılır. Değer her yeni gezinmede% 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şimde bulunduysa (kaydırma, düğmeyi tıklama vb.) didUserInteract doğru değerini alır.
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 hizmeti bağlantısı gerekir. Hizmet bağlandıktan sonra CustomTabsClient.newSession() numaralı telefonu arayıp CustomTabsCallback öğesini ileterek yeni bir CustomTabsSession oluşturabilirsiniz.

Ardından, mevcut tarayıcıda etkileşim sinyallerini destekleyip desteklemediğini kontrol etmek için isEngagementSignalsApiAvailable() numaralı telefonu aramanız gerekir. Destekleniyorsa EngagementSignalsCallback kayıt işlemini CustomTabsSession.setEngagementSignalsCallback() üzerinden yapabilirsiniz.

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);
}