Как отправить данные из моего веб-приложения в мое приложение?
С Crosswalk у меня был очень удобный интерфейс javascript-to-app, так что я мог вызывать функцию java из javascript и обмениваться данными из моего веб-приложения в моем приложении для Android.
Как я могу достичь этого с помощью пользовательских вкладок (или Trusted Web Activity)?
Кажется, нет никакого пути. Должно быть, особенно когда мое приложение и моя игра / веб-приложение принадлежат одному и тому же автору.
Например, я не доверяю LocalStorage, особенно теперь с пользовательскими вкладками, он может быть очищен, или пользователь может удалить браузер и установить другой, так что сохраненные данные будут потеряны, и пользователь будет сердиться на приложение для потеря сохраненных данных, даже не понимая, что данные были в браузере, а не в приложении. Так что раньше мои веб-приложения вызывали приложение, чтобы сохранить данные.
Другой пример, когда пользовательская вкладка использует Firefox вместо Chrome, синтез речи будет недоступен. Я могу легко обнаружить это в моем веб-приложении. Но я хочу, чтобы мое веб-приложение вызывало приложение и отправляло слова для произношения. Это то, что я делал с Crosswalk, так как он не поддерживал речь.
Я понимаю, что веб-просмотры больше подходят для моего использования, чем настраиваемые вкладки, но когда веб-просмотр нельзя использовать на устройстве (особенно на Android <5), в моем приложении не так много других вариантов, кроме открытия настраиваемой вкладки. (или Trusted Web Activity, если доступно). Я больше не могу использовать Crosswalk, он снят с производства и все еще полон серьезных ошибок. И другие решения, такие как GeckoView или Alibaba Gcanvas, не готовы.
редактировать:
В этой статье о деятельности в отношении доверенных веб-сайтов я читаю 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";
Пока я даже не передаю данные, я просто пытаюсь их назвать. но ничего не происходит...
2 ответа
Да, широковещательный приемник по какой-то причине не работает, наверное, безопасность. Но вы можете использовать Activity вместо Broadcast Receiver, чтобы сделать это, как показано ниже.
Используйте настраиваемый URI намерения Android с настраиваемым хостом, параметрами запроса, пакетом, схемой и действием намерения. Вызовите этот URI намерения из своего кода javascript / html. пример
"intent://myhost?key=value#Intent;scheme=myscheme;package=my.app.package;action=someaction;end"
Также объявите действие в файле манифеста с фильтром намерений для обработки конкретного хоста, схемы и действия. пример
<activity android:name="my.app.package.ReceiverActivity">
<intent-filter>
<action android:name="someaction" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="myhost"
android:scheme="myscheme" />
</intent-filter>
</activity>
Теперь в действии обработайте намерение и извлеките данные из параметров запроса. Делайте с данными все, что хотите, и, возможно, завершите действие, если хотите вернуться к тому же экрану. пример
public class ReceiverActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String value = getIntent().getData().getQueryParameter("key");
if (value != null) {
// value is basically your data
}
// in case you want to go back to same screen
finish();
}
}
Вот и все. У вас есть данные для вашего Android Activity. Это ReceiverActivity может (предпочтительно) принадлежать одному и тому же приложению TWA. Теперь из этого действия приемника вы можете легко отправлять / делиться данными в любые другие приложения. Надеюсь это поможет.
Вы можете использовать гибридное решение:
Используйте пользовательские вкладки, как вы хотите для игры.
Ваш сервер может вызывать ваше приложение, когда это необходимо, используя программирование сокетов или push-уведомления, чтобы получить данные, которые необходимо сохранить в вашем приложении.
Также, если отправка данных в ваше приложение не удалась, ваша игра может предупредить пользователя в браузере игры.
Поддержка более старых версий Android приветствуется, насколько это возможно. Распределение версий платформы ( https://developer.android.com/about/dashboards/) на момент написания этого поста гласило, что вы потеряете около 12,7% устройств, если откажетесь от поддержки версии 4.
Рассмотрите возможность поднятия минимальной версии до Lollipop, где WebView
был перемещен в APK и использовать его. Вы получите время и простоту реализации, так как сможете звонить @JavascriptInterface
аннотированные методы, сохраняя вовлеченность ваших пользователей в ваше приложение ( https://developer.android.com/guide/webapps/webview_.