Как отправить данные из моего веб-приложения в мое приложение?

С 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. Теперь из этого действия приемника вы можете легко отправлять / делиться данными в любые другие приложения. Надеюсь это поможет.

Вы можете использовать гибридное решение:

  1. Используйте пользовательские вкладки, как вы хотите для игры.

  2. Ваш сервер может вызывать ваше приложение, когда это необходимо, используя программирование сокетов или push-уведомления, чтобы получить данные, которые необходимо сохранить в вашем приложении.

Также, если отправка данных в ваше приложение не удалась, ваша игра может предупредить пользователя в браузере игры.

Поддержка более старых версий Android приветствуется, насколько это возможно. Распределение версий платформы ( https://developer.android.com/about/dashboards/) на момент написания этого поста гласило, что вы потеряете около 12,7% устройств, если откажетесь от поддержки версии 4.

Рассмотрите возможность поднятия минимальной версии до Lollipop, где WebView был перемещен в APK и использовать его. Вы получите время и простоту реализации, так как сможете звонить @JavascriptInterface аннотированные методы, сохраняя вовлеченность ваших пользователей в ваше приложение ( https://developer.android.com/guide/webapps/webview_.

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