13

使用 Crosswalk,我有一个非常方便的 javascript-to-app 界面,因此我可以从 javascript 调用 java 函数并将我的 webapp 中的数据共享到我的 android 应用程序

如何使用自定义选项卡(或受信任的 Web 活动)实现此目的?

似乎根本没有办法。应该有,尤其是当我的应用程序和我的游戏/网络应用程序来自同一作者时。

例如,我不信任 LocalStorage,尤其是现在使用自定义选项卡时,它可能会被清理,或者用户可能会卸载浏览器并安装另一个浏览器,因此保存的数据将丢失,并且用户会对应用程序感到愤怒保存的数据丢失,甚至不知道数据在浏览器中,而不是在应用程序中。所以我曾经让我的 webapps 调用该应用程序来保存数据。

另一个例子,当自定义选项卡使用 Firefox 而不是 Chrome 时,语音合成将不可用。我可以在我的 webapp 中轻松检测到它。但我希望我的 webapp 调用该应用程序并将其发送给发音的单词。这就是我对 Crosswalk 所做的,因为它也不支持语音。

我知道 webviews 比自定义选项卡更适合我的使用,但是当 webview 不能在设备上使用(尤其是 Android <5)时,我的应用程序除了打开自定义选项卡之外没有很多其他选项(或受信任的 Web 活动,如果可用)。我不能再使用 Crosswalk,它已停产,但仍然充满严重的错误。而 GeckoView 或阿里巴巴 Gcanvas 等其他解决方案还没有准备好。

编辑:

在这篇关于可信网络活动https://developers.google.com/web/updates/2017/10/using-twa的文章中,我阅读了

不过,您可以通过在 URL 中将数据传入和传出页面来协调 Web 内容(例如,通过查询参数、自定义 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";

我现在什至不传递数据,我只是尝试调用它。但什么也没有发生……

4

3 回答 3

7

是的,广播接收器由于某种原因不起作用,可能是安全性。但是您可以使用Activity代替Broadcast Receiver来执行此操作,如下所示。

使用带有自定义主机查询参数方案和意图操作的自定义 Android Intent Uri。从您的 javascript/html 代码中调用此意图 uri。例子

"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 活动中使用数据。此 ReceiverActivity 可以(最好)属于同一个 TWA 应用程序。现在,通过这个Receiver Activity,您可以轻松地将数据发送/共享到任何其他应用程序。希望这可以帮助。

于 2020-04-26T18:55:43.187 回答
0

您可以使用混合解决方案:

  1. 根据需要使用自定义选项卡进行游戏。

  2. 您的服务器可以在需要时调用您的应用程序,使用套接字编程或推送通知来获取您需要保存在应用程序中的数据。

此外,如果向您的应用程序发送数据不成功,您的游戏可以在游戏时在浏览器中警告用户。

于 2018-09-07T09:43:33.330 回答
0

尽可能合理地鼓励支持较旧的 android 版本。平台版本分布 ( https://developer.android.com/about/dashboards/ ) 在撰写这篇文章时指出,如果您放弃对版本 4 的支持,您将失去大约 12.7% 的设备。

考虑将您的最低版本提升到 Lollipop,WebView然后将其移至 APK 并使用它。您将获得时间和实现简单性,因为您将能够调用@JavascriptInterface带注释的方法,同时让您的用户参与您的应用程序 ( https://developer.android.com/guide/webapps/webview_

于 2018-09-08T18:53:06.063 回答