Как я могу открыть браузер Android с указанными параметрами POST? - PullRequest
22 голосов
/ 08 ноября 2010

Я мое приложение, мне нужно открыть ссылку в браузере Android.Эта страница может получать некоторые данные только через POST.Могу ли я добавить эти параметры (данные) в цель, которая запускает браузер?

Знаете ли вы, возможно ли это?Если да, не могли бы вы дать мне подсказку?

Ответы [ 4 ]

11 голосов
/ 04 апреля 2011

Использовать веб-просмотр:

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);
3 голосов
/ 16 сентября 2016
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());
    }
3 голосов
/ 08 ноября 2010

Содержимое, отправляемое в браузер, может содержать не только URL. В более старых версиях Android было возможно упаковать дополнительные данные POST в намерение, в более новых версиях эта возможность исчезла, но можно отправить дополнительные данные заголовка для GET (который может быть практически любым представимым в виде строки) в доставленном намерении в браузер.

0 голосов
/ 12 июня 2015

Я считаю, что в этом вопросе есть небольшое заблуждение.Чего не хватает, так это того, что вам нужно для POST вместо GET .

. Если вы признаете, я сделаю несколько предположений, которые могут быть распространены в этом контексте:

  • Вам необходимо скрыть фактические переменные из истории
  • Вам нужно некоторое взаимодействие с сервером, прежде чем пользователь получит контроль
  • Вы не можете контролировать сам сервер, и он использует (нарочно) POST запросы

Любой из этих параметров или требований подразумевает некоторую дополнительную обработку, отличную от обычного варианта использования браузера (которая дает полный контроль над обработкой и взаимодействием).).Похоже, что вы на самом деле запрашиваете связь между компьютерами (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)

В качестве альтернативы было бы сделать взаимодействие M2M скорее на вашем сервере APP, потому что тогда возможные изменения в BEпоток данных с сервера может быть отражен без изменения приложения. Таким образом, вы фактически переместите связь M2M частично на сторону сервера.

Примечание: Использование приложения для взаимодействия со сторонними серверами может иметь некоторыеюридические последствия. Фактически эти серверы могут не разрешать иное использование, кроме как через браузер (обнаружение человека = капча, обнаружение агента пользователя). В этом случае вам необходимо договориться с владельцем сервера.

...