使用Crosswalk我有一个非常方便的javascript-to-app界面,所以我可以从javascript调用java函数并将数据从我的webapp共享到我的Android应用程序。
如何使用自定义选项卡(或可信Web活动)实现此目的?
似乎完全没有办法。应该有,特别是当我的应用程序和我的游戏/ webapp来自同一作者时。
例如,我不信任LocalStorage,特别是现在使用Custom Tabs,它可能会被清理,或者用户可能会卸载浏览器并安装另一个,因此保存的数据将丢失,用户将对应用程序感到生气丢失保存的数据,甚至不了解数据是在浏览器中,而不是在应用程序中。所以我曾经让我的webapps调用应用程序来保存数据。
另一个例子,当自定义选项卡使用Firefox而不是Chrome时,语音合成将无法使用。我可以在我的webapp中轻松检测到它。但我希望我的webapp可以调用应用程序并将其发送给发音。这就是我在Crosswalk上所做的事情,因为它既不支持演讲也不支持。
据我所知,webview比自定义标签更适合我使用,但是当webview无法在设备上使用时(尤其是Android <5),那么我的应用程序除了打开自定义标签之外没有很多其他选项(或可信的Web活动,如果可用)。我不能再使用Crosswalk,它已经停产,仍然充满了严重的错误。其他解决方案,如GeckoView或Alibaba Gcanvas尚未准备就绪。
编辑:
在这篇关于Trusted Web Activity https://developers.google.com/web/updates/2017/10/using-twa的文章我读过
不过,您可以通过在URL中向页面传递数据来协调Web内容(例如,通过查询参数,自定义HTTP标头和意图URI)。
编辑:
我一直在阅读很多页面,虽然对我来说意图和深层链接仍然模糊不清,但这是我尝试过的。
我为自定义操作添加了一个intent过滤器:
<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";
我现在甚至没有传递数据,我只是试着打电话给它。但没有任何反应......
您可以使用混合解决方案:
此外,如果向您的应用程序发送数据不成功,您的游戏可以在游戏中向浏览器中的用户发出警告。
尽可能鼓励支持旧的Android版本。在撰写这篇文章时,平台版本分发(https://developer.android.com/about/dashboards/)声明,如果您放弃对版本4的支持,您将丢失大约12.7%的设备。
考虑将最低版本提升到Lollipop,其中WebView
被移动到APK并使用它。您将获得时间和实现的简单性,因为您可以调用@JavascriptInterface
注释方法,同时让您的用户参与您的应用程序(https://developer.android.com/guide/webapps/webview_。