Не могу понять, как открыть простое 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
. Для этого варианта использования есть демонстрация, но реализация будет следующей:
- импорт
android-browser-helper
вbuild.gradle
:
dependencies {
...
implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.0.0'
}
- Запустите надежное веб-действие из действия:
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);
}
};
}