2010-11-02 13 views
6

en double possible:
How can I open android browser with specified POST parameters?Lancement navigateur par défaut avec des paramètres d'intention et post

Je voudrais faire quelque chose comme ceci:

startActivity (nouvelle intention (intention. ACTION_VIEW, Uri.parse ("http://www.somepage.com?par1=val1&par2=val2"));

Mais je ne veux pas envoyer les paramètres avec get mais avec post. Comment puis-je faire comme décrit ci-dessus?

Un grand merci à l'avance, navajo

+0

Avez-vous jamais ce travail? J'essaie de faire la même chose. – jax

Répondre

1

Navajo,

Ce que vous essayez de faire ne peut être fait avec l'URL ci-dessus avec les contraintes que vous avez fait ci-dessus. La principale raison à cela est que l'URL ci-dessus est une URL GET. Une URL POST n'a pas les paramètres ci-dessus. Ils sont passés dans la demande réelle et non l'URL. Pour accomplir ce que vous souhaitez faire, vous devez intercepter l'intention, reformater l'URL, puis démarrer le navigateur avec une nouvelle intention. La source de l'URL est la clé. Si la source provient de vous ou de quelque chose que vous pouvez suivre, c'est facile, créez simplement une intention personnalisée. Si la source est hors de votre contrôle, alors vous pouvez rencontrer des problèmes (voir ci-dessous) ...

1) Les GET et les POST ne sont pas interchangeables. Si vous jouez avec des données qui ne vous appartiennent pas ou ne vont pas sur un site que vous contrôlez, vous risquez de casser les fonctionnalités de ce site, car tout le monde ne programme pas GET et POST pour des raisons de sécurité.

2) Si vous répondez à la même intention que le navigateur, il est possible que l'utilisateur ne comprenne pas ce que fait votre application si elle ouvre toujours la valeur par défaut.

Une autre possibilité (si vous contrôlez le site Web) est de répondre à l'intention en créant un cookie que votre site peut lire avec les exigences réelles en matière de données. Cela nécessiterait PHP/ASP sur le serveur ou JS activé HttpRequest(). Si j'avais plus d'informations, je pourrais mieux vous conseiller.

FuzzicalLogic

11

Il peut être fait, mais d'une manière délicate.

Vous pouvez créer un petit fichier html avec un formulaire de soumission automatique, le lire dans une chaîne, remplacer les paramètres et l'incorporer dans l'intention sous la forme d'un uri de données au lieu d'un URL. Il y a quelques petites choses négatives, cela fonctionne uniquement en appelant le navigateur par défaut directement, et le truc sera stocké dans l'historique du navigateur, il apparaîtra si vous revenez en arrière.

Voici un exemple:

fichier 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> 

code source:

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

Ce qui précède fonctionne pour moi aussi. Mais est-ce possible avec _Chrome Custom Tabs_ de la même façon? Je crains que ce serait un hack qui pourrait être réparé plus tôt que plus tard. – xanderiel