使用intent和post参数启动默认浏览器

时间:2010-11-02 17:43:47

标签: android android-intent http-post

  

可能重复:
  How can I open android browser with specified POST parameters?

我想做点什么 像这样:

startActivity(new Intent(Intent.ACTION_VIEW,Uri.parse(“http://www.somepage.com?par1=val1&par2=val2”));

但是我不想发送带有get但带帖子的参数。 我怎么能这样做?

非常感谢, 纳瓦霍

2 个答案:

答案 0 :(得分:11)

它可以做到,但是以一种棘手的方式。

您可以使用自动提交表单创建一个小html文件,将其读入字符串,替换params并将其作为数据uri而不是url嵌入到intent中。 有一些负面的东西,它只能直接调用默认浏览器,并且技巧将存储在浏览器历史记录中,如果你导航回来它会出现。

以下是一个例子:

HTML文件(/ res / raw):

<html>
    <body onLoad="document.getElementById('form').submit()">
        <form id="form" target="_self" method="POST" action="${url}">
            <input type="hidden" name="param1" value="${value}" />
            ...
        </form>
    </body>
</html>

源代码:

private void browserPOST() {
    Intent i = new Intent();
    // MUST instantiate android browser, otherwise it won't work (it won't find an activity to satisfy intent)
    i.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"));
    i.setAction(Intent.ACTION_VIEW);
    String html = readTrimRawTextFile(this, R.raw.htmlfile);

    // Replace params (if any replacement needed)

    // May work without url encoding, but I think is advisable
    // URLEncoder.encode replace space with "+", must replace again with %20
    String dataUri = "data:text/html," + URLEncoder.encode(html).replaceAll("\\+","%20");
    i.setData(Uri.parse(dataUri));
    startActivity(i);
}

private static String readTrimRawTextFile(Context ctx, int resId) {
    InputStream inputStream = ctx.getResources().openRawResource(resId);

    InputStreamReader inputreader = new InputStreamReader(inputStream);
    BufferedReader buffreader = new BufferedReader(inputreader);
    String line;
    StringBuilder text = new StringBuilder();
    try {
        while ((line = buffreader.readLine()) != null) {
            text.append(line.trim());
        }
    }
    catch (IOException e) {
        return null;
    }
    return text.toString();
}

答案 1 :(得分:1)

纳瓦霍,

使用上面提到的约束,上述网址无法完成您要做的工作。主要原因是上面的URL是一个GET URL。 POST URL中没有上述参数。它们是在实际的REQUEST而不是URL中传递的。

要完成您想要的操作,您必须拦截Intent,重新格式化URL,然后使用新的Intent启动浏览器。 URL的来源是关键。如果源来自您或您可以跟踪的内容,那很简单,只需创建一个自定义Intent。如果源不在您的控制之下,那么您可能会遇到问题(见下文)......

1)GET和POST不可互换。如果您正在处理不属于您的数据或未访问您控制的网站,那么您可能会破坏该网站的功能,因为出于安全原因,并非每个人都为GET和POST编程。

2)如果您正在响应浏览器所执行的相同Intent,那么如果用户始终打开默认设置,则可能无法理解您的应用所执行的操作。

另一种可能性(如果您控制网站)是通过创建您的网站可以根据实际数据要求读取的cookie来响应Intent。这需要服务器上的PHP / ASP或JS激活的HttpRequest()。

如果我有更多信息,我可以更好地建议你。

FuzzicalLogic