通过CustomTab或Chrome发布数据

2019年6月25日 48点热度 0条评论

我想通过CustomTab或Chrome发送POST HTTP请求,然后最后显示页面。我进行了很多研究,但没有办法。
有办法吗?
可以通过Volley发送POST请求,然后最终在浏览器中显示响应?

解决方案如下:

我为此写了一个解决方法。

小心,是一个肮脏的;)

步骤:

  • 您需要创建一个带有表单的html文件
  • 向其中添加与您需要传递给URL的值相对应的输入字段
  • 将此文件添加到资产文件夹
  • android代码上的

  • :
  • 读取文件
  • 的内容

  • 将内容保存到外部缓存目录
  • >>这是基本步骤<< 从现在开始,请遵循以下说明(@Skotos关于如何使用自定义标签意图https://stackoverflow.com/a/60078339/2124387打开本地html的答案)

  • 示例:

    这是资产文件夹中名为
    form_template.html的html文件:

        <html>
            <script>
                function submitForm() {
                    document.getElementById("form").submit()
                }
            </script>
    
            <body onload="submitForm()">
                <form id="form" action="{{url}}" method="{{method}}" enctype="{{enctype}}">
                    {{fields}}
                </form>
            </body>
        </html>
    

    结束,这就是我动态传递URL和值的方式

        Map<String, String> values = ImmutableMap.of(
            "fooKey", "fooValue", // whatever you
            "barKey", "barValue"  // need here
        );
    
        try {
            File redirect = new File(activity.getExternalCacheDir(), "redirect.html");
    
            // To get string from input stream look at here https://stackoverflow.com/a/16110044/2124387
            String templateString = getStringFromInputStream(activity.getAssets().open("form_template.html"));
    
            List<String> inputFields = new ArrayList<>();
            for (String key : values.keySet()) {
                inputFields.add(String.format("<input type=\"hidden\" name=\"%s\" value=\"%s\" />", key, values.get(key)));
            }
    
            templateString = templateString.replace("{{url}}", url);
            templateString = templateString.replace("{{method}}", method); // eg. "POST"
            templateString = templateString.replace("{{enctype}}", encodeType); // eg. "application/x-www-form-urlencoded"
            templateString = templateString.replace("{{fields}}", StringUtil.join("\n", inputFields));
    
            FileOutputStream fileOutputStream = new FileOutputStream(redirect);
            fileOutputStream.write(templateString.getBytes());
            Uri uri = FileProvider.getUriForFile(activity, BuildConfig.ApplicationId + ".provider", redirect);
            new Handler().postDelayed(redirect::delete, 5000);
    
            CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
            CustomTabsIntent customTabsIntent = builder.build();
            customTabsIntent.intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION))
            customTabsIntent.launchUrl(this, packageName, url);
        } catch (IOException e) {
            e.printStackTrace();
        }