Доверенная веб-активность / данный CustomTabsIntent должен быть связан с действительным CustomTabsSession - PullRequest
0 голосов
/ 02 мая 2018

Я включил Trusted Web Activity в свое приложение для Android, при запуске TwaLauncherActivity в качестве основного Activity отображается пустой белый экран. Я перешел по ссылке ниже GitHub https://github.com/GoogleChrome/custom-tabs-client/tree/master/svgomg. Пожалуйста, предложите какое-то решение, заранее спасибо,

TwaLauncherActivity.java

    package com.therightdoctors.dpmdoctor;

import android.net.Uri;
import android.os.Bundle;
import android.support.customtabs.CustomTabsIntent;
import android.support.v7.app.AppCompatActivity;

public class TwaLauncherActivity extends AppCompatActivity
        implements TwaSessionHelper.TwaSessionCallback {

    private static final String TWA_ORIGIN = "https://dpm.therightdoctors.com";
    private static final String TARGET_URL = TWA_ORIGIN;

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

        Uri originUri = Uri.parse(TWA_ORIGIN);
        TwaSessionHelper twaSessionHelper = TwaSessionHelper.getInstance();
        twaSessionHelper.setTwaSessionCallback(this);
        twaSessionHelper.bindService(this, originUri);

     /* TwaSessionHelper.TwaSessionCallback twaSessionCallback = twaSessionHelper.mTwaSessionCallback.get();
        if (twaSessionCallback != null) twaSessionCallback.onTwaSessionReady();*/
        // Set an empty transition from TwaLauncherActivity to the splash screen.
        CustomTabsIntent customTabsIntent = twaSessionHelper.createIntentBuilder()
                .setStartAnimations(this, 0, 0)
                .build();
        Uri openUri = Uri.parse(TARGET_URL);
        twaSessionHelper.openTwa(this, customTabsIntent, openUri);


    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        TwaSessionHelper twaSessionHelper = TwaSessionHelper.getInstance();
        twaSessionHelper.setTwaSessionCallback(null);
    }

    public void openTwa() {
        TwaSessionHelper twaSessionHelper = TwaSessionHelper.getInstance();

        // Set an empty transition from TwaLauncherActivity to the TWA splash screen.
        CustomTabsIntent customTabsIntent = twaSessionHelper.createIntentBuilder()
                .setStartAnimations(this, 0, 0)
                .build();

        Uri openUri = Uri.parse(TARGET_URL);
        twaSessionHelper.openTwa(this, customTabsIntent, openUri);
    }

    @Override
    public void onTwaSessionReady() {
        openTwa();
    }

    @Override
    public void onTwaSessionDestroyed() {
    }

    @Override
    public void onTwaOpened() {
        /*finishAndRemoveTask();*/
    }
}

В каталоге отладки показано исключение,

java.lang.RuntimeException: Невозможно запустить действие ComponentInfo {com.therightdoctors.dpmdoctor / com.therightdoctors.dpmdoctor.TwaLauncherActivity}: java.lang.IllegalArgumentException: данный CustomTabsIntent должен быть связан с действительной CustomTabsession atroid.app.ActivityThread.performLaunchActivity (ActivityThread.java:2646)

1 Ответ

0 голосов
/ 03 мая 2018

TWA требуют подключения к CustomTabsService, и код пытается открыть TWA, прежде чем это будет сделано.

В методе onCreate код вызывает bindService и пытается открыть TWA сразу после этого вызова, прежде чем будет установлено соединение и сеанс будет готов (что происходит асинхронно).

Правильно, что нужно сделать, это открыть CustomTab из onTwaSessionReady обратного вызова, чтобы убедиться, что соединение установлено до открытия CustomTab.

Код должен выглядеть следующим образом:

package com.therightdoctors.dpmdoctor;

import android.net.Uri;
import android.os.Bundle;
import android.support.customtabs.CustomTabsIntent;
import android.support.v7.app.AppCompatActivity;

public class TwaLauncherActivity extends AppCompatActivity
    implements TwaSessionHelper.TwaSessionCallback {

private static final String TWA_ORIGIN = "https://dpm.therightdoctors.com";
private static final String TARGET_URL = TWA_ORIGIN;

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

    Uri originUri = Uri.parse(TWA_ORIGIN);
    TwaSessionHelper twaSessionHelper = TwaSessionHelper.getInstance();
    twaSessionHelper.setTwaSessionCallback(this);
    twaSessionHelper.bindService(this, originUri);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    TwaSessionHelper twaSessionHelper = TwaSessionHelper.getInstance();
    twaSessionHelper.setTwaSessionCallback(null);
}

/**
  * This method is defined on the `TwaSessionHelper.TwaSessionCallback`
  * interface, which is implemented by the Activity.
  */
@Override
public void onTwaSessionReady() {
    TwaSessionHelper twaSessionHelper = TwaSessionHelper.getInstance();
    // Set an empty transition from TwaLauncherActivity to the splash screen.
    CustomTabsIntent customTabsIntent = twaSessionHelper.createIntentBuilder()
            .setStartAnimations(this, 0, 0)
            .build();
    Uri openUri = Uri.parse(TARGET_URL);
    twaSessionHelper.openTwa(this, customTabsIntent, openUri);
    openTwa();
}

@Override
public void onTwaSessionDestroyed() {
}

@Override
public void onTwaOpened() {
    // call the below if you want the launcher activity to be 
    // removed from the task stack (eg: back button doesn't go back to it)
    /*finishAndRemoveTask();*/
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...