在我的 Android 应用程序中,我需要在浏览器中打开一个链接。这个页面可以通过 POST 接收一些数据。我能否将这些参数(数据)添加到启动浏览器的意图(intent)中?
你知道这是否可行吗?如果可以,你能给我一些提示吗?
在我的 Android 应用程序中,我需要在浏览器中打开一个链接。这个页面可以通过 POST 接收一些数据。我能否将这些参数(数据)添加到启动浏览器的意图(intent)中?
你知道这是否可行吗?如果可以,你能给我一些提示吗?
使用 Webview:
WebView webview = new WebView(this);
setContentView(webview);
byte[] post = EncodingUtils.getBytes("postvariable=value&nextvar=value2", "BASE64");
webview.postUrl("http://www.geenie.nl/AnHeli/mobile/ranking/demo/index.php", post);
发送到浏览器的意图可以包含不仅仅是一个URL。在较旧版本的Android中,可以将额外的POST数据封装在意图中,但在更新版本中,这种能力已经消失了,但可以通过向发送到浏览器的意图中添加额外的标头数据来实现GET请求(可以是可表示为字符串的任何内容)。
try{
String finalUrl = "javascript:" +
"var to = 'http://the_link_you_want_to_open';" +
"var p = {param1:'"+your_param+"',param2:'"+your_param+"'};" +
"var myForm = document.createElement('form');" +
"myForm.method='post' ;" +
"myForm.action = to;" +
"for (var k in p) {" +
"var myInput = document.createElement('input') ;" +
"myInput.setAttribute('type', 'text');" +
"myInput.setAttribute('name', k) ;" +
"myInput.setAttribute('value', p[k]);" +
"myForm.appendChild(myInput) ;" +
"}" +
"document.body.appendChild(myForm) ;" +
"myForm.submit() ;" +
"document.body.removeChild(myForm) ;";
Uri uriUrl = Uri.parse(finalUrl);
Intent browserIntent = new Intent(Intent.ACTION_VIEW);
PackageManager packageManager = this.getPackageManager();
browserIntent.setData(uriUrl);
List<ResolveInfo> list = packageManager.queryIntentActivities(browserIntent, 0);
for (ResolveInfo resolveInfo : list) {
String activityName = resolveInfo.activityInfo.name;
if (activityName.contains("BrowserActivity")) {
browserIntent =
packageManager.getLaunchIntentForPackage(resolveInfo.activityInfo.packageName);
ComponentName comp =
new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);
browserIntent.setAction(Intent.ACTION_VIEW);
browserIntent.addCategory(Intent.CATEGORY_BROWSABLE);
browserIntent.setComponent(comp);
browserIntent.setData(uriUrl);
}
}
this.startActivity(browserIntent);
}catch (Exception e){
e.printStackTrace();
txtHeader.setText(e.toString());
}
我认为这个问题存在一些误解。缺少的是您需要POST而不是GET的目的。
如果您同意,我将做出一些在此情况下可能很常见的假设:
这些选项或要求中的任何一个都意味着需要进行一些额外的处理,这与通常的浏览器用例不同(其目的是提供完全控制处理和交互)。看起来您实际上正在寻求机器对机器(M2M)通信并最终输出HTML。
如果这是真的,那么使用一些OKHttp、HTTPURLConnection、Apache HTTP Client等是正确的选择。而不是通过Intent调用浏览器,后者几乎没有消息传递能力(只是点火并忘记 - 在http:...的情况下)。实际上需要对数据流进行一些分析(序列图可能有所帮助),然后将该过程工程化为M2M或辅助M2M交互。
如果您正在使用的服务器是您自己的,则为什么不创建一些REST/JSON/SOAP或其他M2M API来进行远程方法调用(RPC/RMI/...)呢?它并不像看起来那么复杂(例如:http://coreymaynard.com/blog/creating-a-restful-api-with-php/ 或 https://docs.phalconphp.com/pt/latest/reference/tutorial-rest.html)。