2010-11-02 4 views
6

Mögliche Duplizieren:
How can I open android browser with specified POST parameters?Einführung Standard-Browser mit der Absicht und nach Parametern

würde Ich mag etwas wie dies tun:

startActivity (neu Intent (Absichtserklärung. ACTION_VIEW, Uri.parse ("http://www.somepage.com?par1=val1&par2=val2"));

Aber ich möchte die Parameter nicht mit Get sondern mit Post senden. Wie kann ich das wie oben beschrieben tun?

Vielen Dank im Voraus, nazi

+0

Haben Sie jemals diese Arbeit bekommen? Ich versuche das Gleiche zu tun. – jax

Antwort

1

Navajo,

Was Sie versuchen, mit der oben genannten URL zu tun, nicht mit den Einschränkungen erfolgen, die Sie oben gemacht haben. Der Hauptgrund dafür ist, dass die obige URL eine GET-URL ist. Eine POST-URL enthält nicht die oben genannten Parameter. Sie werden in der eigentlichen REQUEST und nicht in der URL übergeben.

Um zu erreichen, was Sie tun möchten, müssten Sie die Absicht abfangen, die URL neu formatieren und dann den Browser mit einer neuen Absicht starten. Die Quelle der URL ist der Schlüssel. Wenn die Quelle von Ihnen stammt oder etwas, das Sie verfolgen können, das ist einfach, erstellen Sie einfach eine benutzerdefinierte Absicht. Wenn sich die Quelle außerhalb Ihrer Kontrolle befindet, können Probleme auftreten (siehe unten) ...

1) GETs und POSTs sind nicht austauschbar. Wenn Sie mit Daten zu tun haben, die nicht Ihre sind oder nicht zu einer von Ihnen kontrollierten Site wechseln, können Sie die Funktionalität dieser Site unterbrechen, da nicht jeder aus Sicherheitsgründen sowohl für GETs als auch für POSTs programmiert.

2) Wenn Sie auf die gleiche Absicht wie der Browser reagieren, ist es möglich, dass der Benutzer nicht versteht, was Ihre App macht, wenn sie immer den Standard öffnet.

Eine andere Möglichkeit (wenn Sie die Website unter Kontrolle haben) besteht darin, auf die Absicht zu reagieren, indem Sie ein Cookie erstellen, das Ihre Site mit den tatsächlichen Datenanforderungen lesen kann. Dies würde PHP/ASP auf dem Server oder JS aktiviert HttpRequest() erfordern.

Wenn ich mehr Informationen hätte, könnte ich Sie besser beraten.

FuzzicalLogic

11

Es kann getan werden, aber in einem schwierigen Weg.

Sie können eine kleine HTML-Datei mit einem automatischen Übermittlungsformular erstellen, sie in eine Zeichenfolge lesen, Params ersetzen und sie in der Absicht als Daten-URL anstelle einer URL einbetten. Es gibt ein paar kleine negative Dinge, es funktioniert nur Standardbrowser direkt aufrufen, und Trick wird im Browserverlauf gespeichert werden, wird es angezeigt, wenn Sie zurück navigieren.Hier

ein Beispiel:

HTML-Datei (/ 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> 

Quellcode:

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

Das obige funktioniert auch für mich. Aber kann dies mit _Chrome Custom Tabs_ in ähnlicher Weise getan werden? Ich befürchte, dass dies ein Hack wäre, der früher als später behoben werden könnte. – xanderiel

Verwandte Themen