Не могу понять, как открыть простое TWA внутри приложения (используя AndroidX)

Прежде всего, я в ужасе от ужаса, связанного с разработкой Android-документации.

Я пытаюсь просто открыть TWA внутри моего приложения, и после 2 дней исследований я нахожусь на грани психического расстройства из-за беспорядка, который существует вокруг чего-то, что звучит так просто.

Мне уже удалось создать одно приложение TWA, без суеты, просто отредактируйте манифест и еще несколько вещей.

Теперь мне нужно иметь собственное приложение - скажем, сначала приложение имеет заставку, которая затем открывает TWA внутри приложения.

Я не могу найти какую-либо надлежащую документацию или пример по этому вопросу, который показывает, как это можно сделать.

Самым близким, что я нашел, был этот пример проекта: https://github.com/GoogleChrome/custom-tabs-client

Который делает интенсивное использование шокирующего количества устаревших вещей, делая адаптацию этого метода в моем приложении совершенно бесполезной. Не только это, но и использование бесчисленного количества пользовательских Классов / Помощников, созданных только для этого проекта, что приводит меня к бесконечному марафону вставки копий каждого из них, просто чтобы выяснить, что внутри этого есть больше, чем нужно скопировать в проект.

Это невероятная катастрофа, и все, что я хочу, - это просто запустить в моем приложении чокнутый TWA, но опять это стало еще одним кошмаром для Android с устаревшими указателями документации (читайте видео на их канале со ссылками на руководства, которые больше не подходят для того, что обсуждается в само видео https://www.youtube.com/watch?v=TCgT8dzSiU8 + https://g.co/TrustedWebActivities)

Поэтому, пожалуйста, всем, объясните мне, как, черт возьми, я могу запустить TWA внутри моего приложения, например, с помощью простой заставки.

РЕДАКТИРОВАТЬ: Я пытался использовать CustomTabs способом, но он говорит, что он устарел и вместо этого использовать TrustedWebActivityIntentBuilder, но есть, я повторяю, 0 документации ZERO о том, как использовать это в первую очередь!

0 ответов

На мой взгляд, есть более простой подход.

Во-первых: объявите свою активность TWA в AndroidManifest.xml, как показано ниже. Обратите внимание, что он не запускается по умолчанию, потому что он не обрабатывает намерение android.intent.action.MAIN, поэтому вы можете реализовать свое собственное основное действие.

    <activity
        android:name="com.google.androidbrowserhelper.trusted.LauncherActivity">

        <!-- Edit android:value to change the url opened by the TWA -->
        <meta-data
            android:name="android.support.customtabs.trusted.DEFAULT_URL"
            android:value="https://YOUR_SITE_URL" />

        <!--
          This intent-filter allows the TWA to handle Intents to open
          YOUR_SITE_URL
        -->
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE"/>

            <!-- Edit android:host to handle links to the target URL-->
            <data
                android:scheme="https"
                android:host="YOUR_SITE_URL"/>
        </intent-filter>
    </activity>

Во-вторых: где-то в вашем коде запустите действие TWA с таким намерением. Вы также можете передать URL-адрес сайта в намерении, если хотите.

Intent intent = new Intent(this, com.google.androidbrowserhelper.trusted.LauncherActivity.class);
intent.setData(Uri.parse("ANOTHER_SITE_URL"));
startActivity(intent);

Также обратите внимание на зависимости, необходимые для использования TWA с AndroidX:

implementation 'androidx.browser:browser:1.0.0'
implementation 'com.github.GoogleChrome:android-browser-helper:ff8dfc4ed3d4133aacc837673c88d090d3628ec8'

При запуске доверенного веб-действия из существующего действия рекомендуется использовать TwaLauncher, из android-browser-helper. Для этого варианта использования есть демонстрация, но реализация будет следующей:

  1. импорт android-browser-helper в build.gradle:
       dependencies {
    ...
    implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.0.0'    
}
  1. Запустите надежное веб-действие из действия:
       public void launchTwa(Uri uri) {
    TrustedWebActivityIntentBuilder builder = new TrustedWebActivityIntentBuilder(uri)
        .setNavigationBarColor(Color.RED) // Use the builder to customise.
        .setToolbarColor(Color.BLUE);

    TwaLauncher launcher = new TwaLauncher(this);
    launcher.launch(builder, null, null);
}

По сравнению с другими подходами:

С помощью LauncherActivity: С помощью LauncherActivity добавляет дополнительный уровень косвенного обращения, который приведет к задержкам при запуске доверенного веб-действия из существующего действия (например: Activity X запускает LauncherActivity, который, в свою очередь, запускает доверенное веб-действие).

С помощью androidx.browser напрямую: в этом подходе нет ничего плохого, но TwaLauncher инкапсулирует почти все необходимое, чтобы справиться с этим.

После долгих проб и ошибок мне, как всегда, удалось запустить TWA внутри приложения. Обратите внимание, что это не похоже на WebView, он просто запускает действие в стеке вашего приложения.

Следующее находится в моем коде Activity:

final static String PACKAGE_NAME = "com.android.chrome";
final static String BASE_URL = "https://your.website.com";
CustomTabsClient mClient;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_launcher);

    CustomTabsClient.bindCustomTabsService(this, PACKAGE_NAME, getConnection(BASE_URL));

}

private CustomTabsServiceConnection getConnection(final String url) {

    return new CustomTabsServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            mClient = null;
        }

        @Override
        public void onCustomTabsServiceConnected(
            ComponentName name,
            CustomTabsClient client
        ) {

            final Intent intent;
            final CustomTabsSession customTabsSession;
            final TrustedWebActivityIntentBuilder intentBuilder;

            mClient = client;
            mClient.warmup(0);

            if ((customTabsSession = mClient.newSession(new CustomTabsCallback())) == null) {
                return;
            }

            intentBuilder = new TrustedWebActivityIntentBuilder(Uri.parse(url))
                .setToolbarColor(Color.parseColor("#ffffff"))
                .setNavigationBarColor(Color.parseColor("#ffffff"));

            intent = intentBuilder.build(customTabsSession);

            startActivity(intent);

        }

    };

}
Другие вопросы по тегам