启动默认浏览器,意图和后期参数

问题描述:

可能重复:
How can I open android browser with specified POST parameters?启动默认浏览器,意图和后期参数

我想做些什么 这样的:

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

但我不想发送与获取但与帖子的参数。 如何按上述方式来做到这一点?

很多感谢, 纳瓦霍

+0

你有没有得到这个工作?我正在尝试做同样的事情。 – jax 2010-11-15 16:18:28

纳瓦霍,

什么你正在尝试做的不能用上面的URL来完成与您上述提出的约束。主要原因是上面的URL是一个GET URL。 POST网址中没有上述参数。它们在实际的REQUEST中传递,而不是URL。

要完成你想要做的事情,你必须拦截意图,重新格式化URL,然后用新的Intent启动浏览器。关键是URL的来源。如果源代码来自您或您可以跟踪的内容,那很简单,只需创建一个自定义的Intent。如果来源不在您的控制范围内,则可能会遇到问题(请参阅下文)...

1)GET和POST不可互换。如果你正在搞乱那些不是你自己的数据,或者不想去你控制的网站,那么你可能会破坏该网站的功能,因为并非每个人都出于安全原因同时为GET和POST编程。 2)如果您对浏览器的相同意图做出响应,那么用户可能无法理解您的应用如果始终打开默认设置,则可能无法做到这一点。

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

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

FuzzicalLogic

它可以完成,但以一个棘手的方式。

您可以使用自动提交表单创建一个小的html文件,将其读入一个字符串,替换参数并将其作为数据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(); 
} 
+0

上面的作品也适用于我。但是,这也可以通过_Chrome Custom Tabs_以类似的方式完成吗?我担心这可能是一种破解,可以早晚修复。 – xanderiel 2016-07-29 09:43:00