В Crosswalk у меня был очень удобный интерфейс javascript-to-app, поэтому я мог вызывать функцию java из javascript и обмениваться данными из моего веб-приложения с моим приложением для Android .
Как мне добиться этого с помощью пользовательских вкладок (или Trusted Web Activity)?
Кажется, нет никакого пути. Должно быть, особенно когда мое приложение и моя игра / веб-приложение принадлежат одному и тому же автору.
Например, я не доверяю LocalStorage, особенно теперь с пользовательскими вкладками, он может быть очищен, или пользователь может удалить браузер и установить другой, так что сохраненные данные будут потеряны, и пользователь будет рассержен на приложение для потери сохраненных данных, даже не понимая, что данные были в браузере, а не в приложении. Поэтому я использовал, чтобы мои веб-приложения вызывали приложение для сохранения данных.
Еще один пример, когда пользовательская вкладка использует Firefox вместо Chrome, тогда синтез речи будет недоступен. Я могу легко обнаружить это в моем веб-приложении. Но я хочу, чтобы мое веб-приложение вызывало приложение и отправляло ему слова для произношения. Это то, что я делал с Crosswalk, поскольку он также не поддерживал речь.
Я понимаю, что веб-просмотры больше подходят для моего использования, чем настраиваемые вкладки, но когда веб-просмотр нельзя использовать на устройстве (особенно на Android <5), у моего приложения не так много других вариантов, кроме открытия Пользовательская вкладка (или Trusted Web Activity, если она доступна). Я больше не могу использовать Crosswalk, он снят с производства и все еще полон серьезных ошибок. А другие решения, такие как GeckoView или Alibaba Gcanvas, не готовы. </p>
редактирование:
В этой статье о Trusted Web Activity https://developers.google.com/web/updates/2017/10/using-twa Я прочитал
Тем не менее, вы можете координировать с веб-контентом, передавая данные
на и страницу в URL (например, через параметры запроса, пользовательские
Заголовки HTTP и целевые URI.)
редактирование:
Я читал много страниц. Мне все еще непонятны намерения и глубокие ссылки, но я попробовал вот что.
Я добавил фильтр намерений для настраиваемого действия:
<receiver android:name=".OutgoingReceiver" android:enabled="true">
<intent-filter>
<action android:name="custom_tabs_js_interface" />
</intent-filter>
</receiver>
Я создал класс для этого получателя:
public class OutgoingReceiver extends BroadcastReceiver {
public static final String CUSTOM_INTENT = "custom_tabs_js_interface";
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received" , Toast.LENGTH_SHORT).show();
}
и я называю это в javascript с
location.href="intent:#Intent;action=custom_tabs_js_interface;end";
Пока я даже не передаю данные, я просто пытаюсь вызвать их.
но ничего не происходит ...