2010-11-02 79 views
6

可能重複:
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

回答

1

納瓦霍,

什麼你正在嘗試做的不能用上面的URL來完成與您上述提出的約束。主要原因是上面的URL是一個GET URL。 POST網址中沒有上述參數。它們在實際的REQUEST中傳遞,而不是URL。

要完成你想要做的事情,你必須攔截意圖,重新格式化URL,然後用新的Intent啓動瀏覽器。關鍵是URL的來源。如果源代碼來自您或您可以跟蹤的內容,那很簡單,只需創建一個自定義的Intent。如果來源不在您的控制範圍內,則可能會遇到問題(請參閱下文)...

1)GET和POST不可互換。如果你正在搞亂那些不是你自己的數據,或者不想去你控制的網站,那麼你可能會破壞該網站的功能,因爲並非每個人都出於安全原因同時爲GET和POST編程。 2)如果您對瀏覽器的相同意圖做出響應,那麼用戶可能無法理解您的應用如果始終打開默認設置,則可能無法做到這一點。

另一種可能性(如果您在控制網站的話)是通過創建一個cookie來響應意圖,您的站點可以根據實際的數據要求來讀取該cookie。這需要服務器上的PHP/ASP或JS激活的HttpRequest()。

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

FuzzicalLogic

11

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

您可以使用自動提交表單創建一個小的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