如何将数据从TWA Web应用程序发送到我的应用程序?

Die*_*ego 5 android deep-linking android-intent chrome-custom-tabs trusted-web-activity

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

如何通过“自定义标签”(或“受信任的网络活动”)实现此目标?

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

例如,我不信任LocalStorage,尤其是现在带有“自定义选项卡”的LocalStorage,它可能会被清理,或者用户可能会卸载浏览器并安装另一个浏览器,因此保存的数据将丢失,并且用户会对该应用程序感到恼火丢失保存的数据,甚至不了解数据在浏览器中,而不在应用程序中。所以我以前让我的Web应用程序调用该应用程序以保存数据。

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

我知道Web视图比“自定义标签”更适合我使用,但是当无法在设备(尤其是Android <5)上使用Web视图时,除了打开“自定义标签”外,我的应用没有很多其他选择(或信任的网络活动,如果可用)。我再也不能使用Crosswalk了,它已经停产并且仍然充满严重的错误。其他解决方案(如GeckoView或阿里巴巴Gcanvas)尚未准备就绪。

编辑:

在这篇关于可信网络活动的文章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>
Run Code Online (Sandbox Code Playgroud)

我为该接收器创建了一个类:

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();
    }
Run Code Online (Sandbox Code Playgroud)

我用javascript来称呼它

location.href="intent:#Intent;action=custom_tabs_js_interface;end";
Run Code Online (Sandbox Code Playgroud)

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

sha*_*ank 6

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

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

"intent://myhost?key=value#Intent;scheme=myscheme;package=my.app.package;action=someaction;end"
Run Code Online (Sandbox Code Playgroud)

同时声明活动清单与文件意图过滤器来处理特定的主机方案行动。例子

<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>
Run Code Online (Sandbox Code Playgroud)

现在在活动中,处理意图并从查询参数中提取数据。对数据做任何你想做的事情,如果你想回到同一个屏幕,可能会完成活动。例子

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

就是这样。您可以在 Android Activity 中使用数据。这个 ReceiverActivity 可以(最好)属于同一个 TWA 应用程序。现在,从这个Receiver Activity,您可以轻松地将数据发送/共享到任何其他应用程序。希望这可以帮助。

  • 我实际上尝试扩展 [LauncherActivity](https://github.com/GoogleChrome/custom-tabs-client/blob/master/customtabs/src/android/support/customtabs/trusted/LauncherActivity.java) 并处理新意图相同的活动,但它会导致活动重新创建。LaunchMode 显然在这里没有帮助。 (2认同)

Bah*_*man 0

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

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

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

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